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

Posted _dshizhh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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];
    }
View Code

 

以上是关于LeetCode动态规划题总结持续更新的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 动态规划刷题总结

leetcode刷题-贪心算法(持续更新)

leetcode之动态规划刷题总结1(Java)

leetcode之动态规划刷题总结8

leetcode之动态规划刷题总结6

leetcode之动态规划刷题总结7