剑指offer(leetcode 10.) 正则表达式匹配

 这题一年前就做过,当时刚开始刷leetcode,提交了几十次过不去,就放那没管了。今天剑指offer又遇到这题,终于做出来了,用的dp。

 1 class Solution {
 2 public:
 3     bool isMatch(string s, string p) {
 4         int s_len=s.size(),p_len=p.size();
 5         vector<vector<bool>> dp(s_len+1,vector<bool>(p_len+1,false));
 6         //dp[i][j]表示s[0,i-1]和p[0,j-1]能否匹配
 7         dp[0][0]=true;//空串匹配空串
 8         for(int i=1;i<=p_len;++i){
 9             dp[0][i]=i>1 and p[i-1]=='*' and dp[0][i-2];
10         }
11         for(int i=1;i<=s_len;++i){
12             for(int j=1;j<=p_len;++j){
13                 if(p[j-1]=='*'){
14                     if(p[j-2]!='.'){//数字+'*'
15                         dp[i][j]=dp[i][j-2] or (s[i-1]==p[j-2] and (dp[i-1][j-2] or dp[i-1][j-1]));
16                     }
17                     else{//'.'+'*'
18                         for(int k=i;k>= 0;--k){
19                             if(dp[k][j-2]){
20                                 dp[i][j]=true;
21                                 break;
22                             }
23                         }
24                     }
25                 }
26                 else if(p[j-1]=='.'){
27                     dp[i][j]=dp[i-1][j-1];
28                 }
29                 else{//数字
30                     dp[i][j]=p[j-1]==s[i-1] and dp[i-1][j-1];
31                 }
32             }
33         }
34         return dp.back().back();
35     }
36 };

猜你喜欢

转载自www.cnblogs.com/FdWzy/p/12293663.html