【noi 2.6_6252】带通配符的字符串匹配(DP)

题意:给出一个带有通配符("?"可以代替一个字符,"*"可以代替零个或多个字符)的a字符串和一个不带通配符的b字符串,判断他们是否能够匹配。

解法:f[i][j]表示a串的前i个是否能和b串的前j个匹配。其中,"?"由f[i-1][j-1]推出,"*"由f[i-1][0~j]推出,便用一个变量p存这些状态。

疑问:我自认为可以写滚动数组的,可惜一直错,求助~ (>_<)

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 
 7 char s[25],ss[25];
 8 int f[25][25];
 9 
10 int main()
11 {
12     scanf("%s%s",s+1,ss+1);
13     int l=strlen(s+1),ll=strlen(ss+1);
14     memset(f,0,sizeof(f));
15     f[0][0]=1;
16     for (int i=1;i<=l;i++)
17     {
18      bool p=f[i-1][0];
19      if (s[i]=='*') f[i][0]=p;
20      for (int j=1;j<=ll;j++)
21      {
22        p|=f[i-1][j];
23        if (s[i]=='?'||s[i]==ss[j]) f[i][j]|=f[i-1][j-1];
24        if (s[i]=='*') f[i][j]|=p;
25      }
26     }
27     if (f[l][ll]) printf("matched");
28     else printf("not matched");
29     return 0;
30 }

 

posted @ 2016-10-09 13:22  konjac蒟蒻  阅读(399)  评论(0编辑  收藏  举报