这个题目挺难的,我是看了题解才有思路的,自己修修改改搞了蛮久,自己去写发现蛮多坑的!
1.对于是字符串 s 、p,s和p都为空匹配,s为空 p不为空时 是有可能匹配的, s不为空,p为空,不匹配,这个是属于比较细节的地方了。
2.还有就是dp的那个vector行要多开1,列要多开2,不然也是会出问题的,因为可能会越界的,这些坑了我不少时间!
#include<bits/stdc++.h>
using namespace std;
int n,m;
bool stringMatch(string s,string p,int i,int j,vector<vector<int> >& dp){
if(dp[i][j]!=-1) return dp[i][j]==1?true:false;
bool ans=true;
bool flag=true;
if(n==i&&m==j) return true;
if(i!=n&&j==m) return false;
if(n==i&&m!=j) flag=false;
if(flag&&(s[i]==p[j]||p[j]=='.')) flag=true;
else flag=false;
if(j+1<=m-1&&p[j+1]=='*'){ //带星号的处理情况
bool x=(flag&&stringMatch(s,p,i+1,j,dp));
ans=(stringMatch(s,p,i,j+2,dp))||x;
}
else {
ans=flag&&stringMatch(s,p,i+1,j+1,dp);
}
dp[i][j]=(ans==true?1:0);
return ans;
}
bool isMatch(string s, string p)
{
n=s.size();
m=p.size();
vector<vector<int> > dp(n+1,vector<int>(m+2));
for(int i=0;i<n+1;i++)
for(int j=0;j<m+2;j++){
dp[i][j]=-1;
}
return stringMatch(s,p,0,0,dp);
}
int main(){
string s,p;
cin>>s>>p;
bool flag=isMatch(s,p);
cout<<(flag==true?"true":"false")<<endl;
return 0;
}