时间限制: 1 Sec 内存限制: 256 MB
提交: 395 解决: 78
[提交][状态][讨论版]
题目描述
有一款英语练习游戏是这样的,每次会给出一些字母,然后需要你从中拼出一个最长的英文单词。
虽然williamchen的英语非常差,但是他现在搞到了一本英语词典,他只需要在词典里找出一个最长的符合条件的字母即可。
现在你需要写一个程序来帮助他完成这个任务。
输入
包含多组测试数据,每组数据开始一行包含不超过20个字母,表示游戏给出的字母。
接下来是一行一个数字N(1 <= N <= 1000)
接下来N行,每行一个字符串表示词典中的单词,单词长度不会超过10。
输出
每组数据输出一行,表示最长可能拼出的单词长度,如果一个单词都拼不出,那就输出0。
样例输入
masterblodpo
7
boogie
magnolia
punch
blood
master
inherent
phantom
ablderrivala
5
arrival
blade
runner
incendies
sicario
abc
2
b
ba
样例输出
6
7
2
ac代码:
#include<functional>
#include<algorithm>
#include<iostream>
#inlcude<cstdlib>
using namespace std;
int main(){
char s[22];
while(cin>>s)
{
int sN=strlen(s);
sort(s,s+sN,less<int>());
int m;
cin>>m;
int compareResult=0;
while(m--){
char str[11]="";
cin>>str;
int strN=strlen(str);
sort(str,str+strN,less<int>());
int compare=0,kase=0;
for(int i=0;i<strN;i++){
for(int j=kase;j<sN;j++,kase++){
if(str[i]==s[j]){
compare++;
kase++;
break;
}
if(j==sN-1){
compare=0;
i=strN;
break;
}
}
}
compareResult=compareResult>compare?compareResult:compare;
}
cout<<compareResult<<endl;
}
return 0;
}
解释:
如何匹配两个字符串是这道题的关键:
假如要匹配的是kill与kk。
(1)有两个字符串都要遍历字符,所以要有两个循环。
(2)谁内谁外:因为只要kk中的某个字符在kill中找不到,那么直接结束等于0。所以以kk为外循环,kill为内循环,只要kill找不到那么结束。具有结束条件的放在内循环里,其实反着也行这样好理解。
(3)这个kase是停留在kill中的位置,意思是kk中的第一个k匹配到了kill中的k,kk中的第二个k匹配时应该从i除开始。所以要求这个kase定义在内循环外面,在内循环再次开始时不被清零。
内外层循环:
内层循环遇到break跳出,外层循环继续进行,并且跳出视为完成一次内循环,i加1。
#include<stdio.h>
int main(){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
printf("%d*%d\n",i,j);
if(j==3)break;
}
}
return 0;
}
求一个字符串有多长:
(1)定义:在acm里面一般给出字符串不超过多少个字符,所以char s[22];
(2)造轮子:
int sN=0;
for(int i=0;i<22;i++){
if(s[i]=='\0')break;
sN++;
}
(3)不造轮子:调用库函数:
int sN=strlen(s);