用动态规划
思想是:每次计算后都保存当前的运行结果
f[i][j]表示串s[0···i-1]与从串p[0···j-1]的比较结果
首先,f[0][0]表示两空串比较结果为真 f[0][0]=true;
其次,当原串不为空时,无论p串是什么结果都为真,即f[i][0]=false; 而当原串为空时,需考虑p串的p[j-1]是否等于‘*’,当等于时再考虑p[j-3]是否已经与空串比较为真即f[0][j-2]
最后,以上是边界条件,真个过程中通过判断p[j-1]是否为‘*’,分为两种情况:
否:比较简单,直接比较p[j-1]与s[i-1],或者p[j-1]为'.',注意还要加上之前f[i-1][j-1]
是:第一种,s[i-1]已与p[j-3]前面的串都相同,则f[i][j-2]就可以了;第二种,判断s[i-1]与p[j-2]比较相同,再加上之前的串f[i-1][j]
1 class Solution { 2 public: 3 bool isMatch(string s, string p){ 4 int lens=s.length(); 5 int lenp=p.length(); 6 vector<vector<bool>> f(lens+1,vector<bool>(lens,false)); 7 f[0][0]=true; 8 for(int i=1;i<=lens;i++) 9 { 10 f[i][0]=false; 11 } 12 for(int j=1;j<lenp;j++) 13 { 14 f[0][j]=j>1&&p[j-1]=='*'&&f[0][j-2]; 15 } 16 for(int i=0;i<lens;i++) 17 for(int j=0;j<lenp;j++) 18 { 19 if(p[j-1]!='*') 20 { 21 f[i][j]=f[i-1][j-1]&&(p[j-1]==s[i-1]||p[j-1]=='.'); 22 } 23 else 24 f[i][j]=f[i][j-2]||(s[i-1]==p[j-2]||'.'==p[j-2])&&f[i-1][j]; 25 } 26 } 27 };