之前刷CF的时候经常碰到字符串DP。
但刚开始做的时候以为是个模拟,想了好一会没思路,看了动态规划这个tag后直接秒了。。
一般字符串DP的状态设置:
dp[i][j],a串匹配前i个,b串匹配前j个,的方案/状态/合法与否。
然后就是一些细节处理了。。
class Solution {
public:
int dp[1100][1100];
int a[1110],b[1100];
bool isMatch(string s, string p) {
int n=s.length(),m=p.length(),sz=0,tp=0;
while(tp<m){
if(p[tp+1]=='*'){
b[++sz]=p[tp]+500;
tp+=2;
}else{
b[++sz]=p[tp];
tp++;
}
}
for(int i=1;i<=n;i++)a[i]=s[i-1];
memset(dp,0,sizeof(dp));
dp[0][0]=1;
if(b[1]>500)dp[0][1]=1;
cout<<n<<" "<<sz<<endl;
for(int i=0;i<=n;i++)
for(int j=1;j<=sz;j++){
if(b[j]>500){
dp[i][j]|=dp[i][j-1];
}
if(i==0)continue;
if(b[j]=='.'||b[j]==a[i]){
dp[i][j]|=dp[i-1][j-1];
}
if(b[j]-500==a[i]||b[j]-500=='.'){
dp[i][j]|=dp[i-1][j];
dp[i][j]|=dp[i-1][j-1];
}
}
return dp[n][sz];
}
};