您的位置:首页 > 其它

带通配符的字符串匹配

2015-10-19 19:04 162 查看
总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。 
你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。 
例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456; 
2*77?8可以匹配 24457798、237708、27798。

输入
输入有两行,每行为一个不超过20个字符的字符串,第一行带通配符,第二行不带通配符
输出
如果两者可以匹配,就输出“matched”,否则输出“not matched”
样例输入
1*456?
11111114567
样例输出
matched

用bool数组f[i][j]表示A串前i个字符和B串前j个字符.
当A[i]不为'*',f[i][j]的真假和f[i-1][j-1]相等;
当A[i]=='*'时,若A[i]表示单字符,则f[i][j]由f[i-1][j-1]的真假转移
若A[i]表示多字符,则f[i][j]由f[i][j-1]的真假转移
        若A[i]表示空,则f[i][j]由f[i-1][j]的真假转移
以上三种满足一个为true即可认为f[i][j]=true;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
char A[800],B[800];
bool f[800][800];
int lena,lenb;
int main(){
scanf("%s%s",A,B);
lena=strlen(A); lenb=strlen(B);
f[0][0]=true;
for(int i=0;i<lena;i++){
if(A[i]=='*'){
f[i+1][0]=true;
}
else break;
}
for(int i=0;i<lena;i++){
for(int j=0;j<lenb;j++){
if(A[i]==B[j]||A[i]=='?'){
f[i+1][j+1]=f[i][j];
continue;
}
else if(A[i]=='*'){
if(f[i][j]==true||f[i][j+1]==true||f[i+1][j]==true)
f[i+1][j+1]=true;
else f[i+1][j+1]=false;
continue;
}
f[i+1][j+1]=false;
}
}

if(f[lena][lenb]==true){
cout<<"matched"<<endl;
return 0;
}
else{
cout<<"not matched"<<endl;
return 0;
}
return 0;
}

 



 

 






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: