您的位置:首页 > 其它

soj 1197. Hotel

2013-01-09 20:44 274 查看
题意:

给一个记忆中的字符串s,由'a'-'z','*','?'组成,'*'表示忘了一串字符(可以是0个字符),'?'表示忘了一个字符。

比如*可以表示任意字符串;?ab可以表示aab,bab等,但是不能表示aaab。

再给出N个实际的字符串t,由'a'-'z'组成,问这N个字符串有多少满足记忆中的字符串的形式。

思路:

将每一个t与s进行对比,记布尔值f[i][j]表示s[1...i]与t[1...j]相符与否,然后递推,最后s与t是否相符就是f[lens][lent]。

递推方程:

1)如果s[i] == t[j] 或者s[i] == '?',那么f[i][j] = f[i-1][j-1]

2)如果s[i] == '*',那么f[i][j] = f[i][j-1] || f[i-1][j-1] || f[i-1][j]

其中注意:1)初始化f[0][0] = true;2)当s[i] == '*' 的时候f[i][0] = f[i-1][0]要单独考虑进去。

code:

#include <cstdio>
#include <cstring>
#define N 55
int n, ans;
char tar
, hot
;
bool f

;
bool match()
{
int tlen=strlen(tar+1), hlen=strlen(hot+1);
memset(f, false, sizeof(f));
f[0][0] = true;
for (int i = 1; i <= tlen; ++ i)
{
if (tar[i] == '*') f[i][0] = f[i-1][0];
for (int j = 1; j <= hlen; ++ j)
{
if (tar[i]==hot[j] || tar[i]=='?') f[i][j] = f[i-1][j-1];
else if (tar[i]=='*') f[i][j] = f[i][j-1] || f[i-1][j-1] || f[i-1][j];
}
}
return f[tlen][hlen];
}
int main()
{
while (~scanf("%s", tar+1))
{
ans = 0;
scanf("%d", &n);
while (n --)
{
scanf("%s", hot+1);
if (match()) ans ++;
}
printf("%d\n", ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: