dp问题:
key[1..i] 与 w[1..j] 是否匹配?用状态f【i】【j】记录:
状态转移方程如下:
f【i】【j】=
f【i-1】【j-1】 if key【i】== ‘?’
f【i-1】【j-1】 && key【i】==w【j】 if key【i】为字母
f【i-1】【j】|| f【i-1】【j-1】||f【i】【j-1】 if key【i】==‘*’
‘*’ 无匹配 匹配一个 匹配>=2;
注意: 在初始化时除了将f[0][0]=1,还有当key[i]为‘*’时,将f[i][0] = f[i-1][0], 这样可以避免导致 输入*t 1 t 输出0的情况,还有输入a*t 1 t, 输出1的情况。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string.h>
using namespace std;
bool f[51][51];
int main()
{
char s0[51],s1[51];
int n,c;
while( scanf("%s",s0)!=EOF )
{
scanf("%d",&n);
c=0;
while( n--)
{
scanf("%s",s1);
memset( f,0,sizeof(f));
int l0 =strlen(s0), l1= strlen(s1);
int i,j;
f[0][0] =1;
for( i=1; i<=l0; i++) //该部初始化应特别注意
if( s0[i-1]=='*')
f[i][0] =f[i-1][0];
for( i=1; i<=l0; i++)
for( j=1; j<=l1; j++)
{
if( s0[i-1] ==s1[j-1] || s0[i-1] =='?')
f[i][j] =f[i-1][j-1];
else if( s0[i-1]=='*')
f[i][j] = f[i-1][j] ||f[i-1][j-1] || f[i][j-1];
}
if( f[l0][l1])
c++;
}
printf("%d\n",c);
}
return 0;
}
本文详细阐述了动态规划算法在解决字符串匹配问题时的应用,包括状态转移方程的设定及初始化注意事项,通过实例代码深入理解匹配逻辑。
682

被折叠的 条评论
为什么被折叠?



