题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2585
题目大意:马克思要找个曾经去过的很好的旅馆,可惜他记不完整旅馆的名字。他有已知的部分信息和可能的旅馆全称,输出匹配的旅馆名个数。已知信息中‘*’代表此处为0或多个小写字母,‘?’代表此处仅有一个小字母。
代码如下
//匹配字符串递归 #include<iostream> #include<string> using namespace std; bool find(string a,string b) { int i,j; for(i=0;i<a.length();i++) { if(a[i]=='*') { if(i==a.length()-1) return true; //若在字符串末尾,显然符合要求; string c=a.substr(i+1); //否则取其后子串; //该子串若与b后任意子串符合要求 for(j=i;j<b.length();j++) if(find(c,b.substr(j))) return 1; } else { if(i>=b.length()) return 0; if(a[i]=='?') continue; if(a[i]!=b[i]) return 0; } } return 1; } int main() { int ans; string a,b; while(cin >> a) { int k; ans=0; cin >> k; while(k--) { cin>>b; if(find(a,b)) ans+=1; } printf("%d\n",ans); } return 0; }