LeetCode动态规划题总结【持续更新】

以下题号均为LeetCode题号,便于查看原题。

10. Regular Expression Matching

题意:实现字符串的正则匹配,包含‘.‘ 和 ‘*‘。‘.‘ 匹配任意一个字符,"*" 匹配 ‘*‘ 之前的0个或多个字符。

example:

isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "a*") → true
isMatch("aa", ".*") → true
isMatch("ab", ".*") → true
isMatch("aab", "c*a*b") → true

思路:输入字符串 s[0...m] 和 p[0...n]

f[i][j] 表示 s[0..i-1] 和 p[0..j-1] 匹配,我们需要判断 s 和 p 是否匹配,就是求 f[m][n] 的值是否为true,所以要往后更新 f[i][j] 的值。

更新思路如下:

1、if p[j-1]!=‘*‘, f[i][j] = f[i-1][j-1] & (s[i-1]==p[j-1] || p[j-1]==‘.‘)

2、if p[j-1]==‘*‘, 看 ‘*‘ 匹配多少个字符,即匹配多少个p[j-2]。

如果 ‘*‘ 匹配0个字符,此时,p[0...j-1]==p[0...j-3],f[i][j]=f[i][j-2];

如果 ‘*‘ 匹配1个字符,此时,p[0...j-1]==p[0...j-2],f[i][j]=f[i][j-1];

如果 ‘*‘ 匹配多个字符,此时,p[0...j-1]=={ p[0: j-2], p[j-2], ... , p[j-2] },f[i][j]=(s[i-1]==p[j-2] || p[j-2]==‘.‘) & f[i-1][j]

public boolean isMatch(String s, String p)
    {
        int m = s.length();
        int n = p.length();
        boolean[][] f = new boolean[m+1][n+1];
        f[0][0] = true;

        for (int i = 0; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if(p.charAt(j-1)!=‘*‘)
                {
                    f[i][j] = i>0 && f[i-1][j-1] && (s.charAt(i-1)==p.charAt(j-1) || p.charAt(j-1)==‘.‘);
                }
                else
                {
                    f[i][j] = (j>1&&f[i][j-2]) || (i>0&&(s.charAt(i-1)==p.charAt(j-2)||p.charAt(j-2)==‘.‘)&&f[i-1][j]);
                }
            }
        }

        return f[m][n];
    }

时间: 2024-10-26 15:21:54

LeetCode动态规划题总结【持续更新】的相关文章

LeetCode刷题(持续更新ing……)

准备刷题了!已经预见未来的日子是苦并快乐的了!但越努力,才能越有底气呀!?? 由于本人主要使用 PHP 语言,所以刷题主要用 PHP 来写代码,自学 Go 中,时间精力都允许的情况下看看能不能用 Go 语言刷一遍,巩固语法知识点???♀? 由易到难,走起!?? 数组 #1 | Two Sum 两数之和 哈希表 队列 链表 树 堆 图 原文地址:https://www.cnblogs.com/sunshineliulu/p/12254156.html

快速上手leetcode动态规划题

快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了解到动态规划是“带有备忘录的递归”, 而大多数用来理解动态规划的例子都是斐波那契数列,就是那个经典的递归式 f(i)=f(i-1)+f(i-2) ,f(1)=f(2)=1 那么我们就可以得到很多式子,比如求f(5): f(5)=f(4)+f(3); f(4)=f(3)+f(2); f(3)=f(2)

leetcode腾讯精选练习(50 题)(持续更新)

1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1,2,3,4]输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题. 题解:记录前缀积和后缀积. 参考代码: class Solution { public: vector<int> productExceptSelf(vector&

Codeforces/TopCoder/ProjectEuler 散题笔记 (持续更新)

最近做到了一些有趣的散题,于是开个Blog记录一下吧- (如果有人想做这些题的话还是不要看题解吧-) 2017-03-16 PE 202 Laserbeam 题意:有一个正三角形的镜子屋,光线从$C$点射入,求恰好反射$12017639147$次后在$C$点射出的方案数. 题解:关于反射问题容易想到对称性,不断对称翻转正三角形,可以密铺整个平面,这样一条反射$k$次的路径对应平面上经过$k$条边的路径. 然后取$CB,CA$为基,把平面画正,就能得到一个带有平行的对角线的网格图,稍微观察一下就能

用python做oj上的简单题(持续更新中.......)

本人刚开始接触python,在oj上解一些简单的题,欢迎交流,不喜勿喷. OJ地址链接:acm.sdut.edu.cn http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=1110&cid=1278 #!/usr/bin/env python # coding=utf-8 print 'Hello World!' http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&prob

hzwer分块九题(暂时持续更新)

hzwer分块9题 分块1:区间加法,单点查询 Code #include<bits/stdc++.h> #define in(i) (i=read()) using namespace std; const int N=5e5+10,inf=2e9; int read() { int ans=0,f=1; char i=getchar(); while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();} while(i>='0'

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)

LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) 剑指Offer 数据结构 链表 序号 题目 难度 06 从尾到头打印链表 简单 18 删除链表的节点 简单 22 链表中倒数第k个节点 简单 二叉树 序号 题目 难度 07 重建二叉树 中等 栈和队列 序号 题目 难度 09 用两个栈实现队列 简单 图 序号 题目 难度 12 矩阵中的路径 中等 13 机器人的运动范围 中等 算法 动态规划 序号 题目 难度 10- I 斐波那契数列 简单 10- II 青蛙跳台阶问题 简单 查找

Leetcode动态规划【简单题】

目录 Leetcode动态规划[简单题] 53. 最大子序和 题目描述 思路分析 复杂度分析 70.爬楼梯 题目描述 思路分析 复杂度分析 121.买卖股票的最佳时机 题目描述 思路分析 复杂度分析 303.区域和检索-数组不可变 题目描述 思路分析 复杂度分析 Leetcode动态规划[简单题] 动态规划(Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法.动态规划相较于递归,拥有更少的计算量. 53. 最大子序和 题目描述 给定一

【leetcode刷题笔记】Triangle

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below. For example, given the following triangle [ [2], [3,4], [6,5,7], [4,1,8,3] ]  The minimum path sum from top to bottom is 11 (