dp:
http://blog.csdn.net/qq_28954601/article/details/77484676
#include <bits/stdc++.h> #define mt(a,b) memset(a,b,sizeof(a)) using namespace std; const int maxn = 2525; bool dp[maxn][maxn]; char s[maxn]; char t[maxn]; int main() { int T; scanf("%d",&T); getchar(); while(T--) { scanf("%s",s+1); scanf("%s",t+1); s[0]=t[0]='1'; int len1=strlen(s)-1; int len2=strlen(t)-1; mt(dp,false); dp[0][0]=true; for(int i=1;i<=len2;++i){ if(i==2&&t[i]=='*') dp[i][0]=true; for(int j=1;j<=len1;++j){ if(t[i]==s[j]||t[i]=='.'){ dp[i][j]=dp[i-1][j-1]; //如果正常匹配的话,dpij就是从dpi-1j-1转移过来的 }else if(t[i]=='*'){ dp[i][j]=dp[i-1][j]|dp[i-2][j];//如果这个*号的前面一个或者前面的第二个可以匹配到j位置的,则可以,我觉得是使用在多个*的时候的 if((dp[i-1][j-1]||dp[i][j-1])&&s[j-1]==s[j]) //如果是sj-1==sj的话,可以自己举例子看看就会清楚这是什么情况了 dp[i][j] = true; } } } puts(dp[len2][len1]?"yes":"no"); } return 0; }