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

LeetCode 10. Regular Expression Matching

时间:2018-09-27 10:36:11      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:表示   matching   ase   col   初始化   class   ring   ret   设置   

经典DP题目,比较复杂,需要多复习。

dp[i][j] 表示 s 下标0~i,p 下标0~j 是否能够匹配

                 dp[i-1][j-1]    s[i]==p[j] || p[j]==‘.‘

dp[i][j] =     dp[i][j-2]       p[j]==‘*‘, 0 occurence      

       dp[i-1][j]      p[j]==‘*‘, s[i]==p[j-1] || p[j-1]==‘.‘

第一行是 p[j]!=‘*‘的情况;后两行是p[j]==‘*‘的情况

dp[s.size()-1][p.size()-1] 为所求

 

为了方便,把dp[i][j]定义换为 s的前i个字符,p的前j个字符,设置dp[0][0] = true,可以方便base case的初始化。需要注意下标的对应。

dp[i][0] 都是false不用管,dp[0][j]不一定,利用dp[0][0]=ture,可以和计算dp写在一起。 

 

class Solution {
public:
    bool isMatch(string s, string p) {
        vector<vector<bool>> dp(s.size()+1, vector<bool>(p.size()+1, false));
        dp[0][0] = true;
        for (int i=0;i<=s.size();++i){
            for (int j=1;j<=p.size();++j){
                if (j>=2 && p[j-1]==*){
                    dp[i][j] = dp[i][j-2] || i>=1 && dp[i-1][j] && (s[i-1]==p[j-2] || p[j-2]==.);
                }else{
                    dp[i][j] = i>=1 && dp[i-1][j-1] && (s[i-1]==p[j-1] || p[j-1]==.);
                }
            }
        }
        return dp[s.size()][p.size()];
    }
};

 

LeetCode 10. Regular Expression Matching

标签:表示   matching   ase   col   初始化   class   ring   ret   设置   

原文地址:https://www.cnblogs.com/hankunyan/p/9711046.html

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