剑指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 };
进击的小🐴农