码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-03-21 17:54:58      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

以下题号均为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动态规划题总结【持续更新】

标签:

原文地址:http://www.cnblogs.com/shizhh/p/5302852.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!