XDU1292问题:World Game


时间限制: 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;
} 

解释:

如何匹配两个字符串是这道题的关键:

假如要匹配的是killkk

1)有两个字符串都要遍历字符,所以要有两个循环。

2)谁内谁外:因为只要kk中的某个字符在kill中找不到,那么直接结束等于0。所以以kk为外循环,kill为内循环,只要kill找不到那么结束。具有结束条件的放在内循环里,其实反着也行这样好理解。

3)这个kase是停留在kill中的位置,意思是kk中的第一个k匹配到了kill中的kkk中的第二个k匹配时应该从i除开始。所以要求这个kase定义在内循环外面,在内循环再次开始时不被清零。

 

 

内外层循环:

内层循环遇到break跳出,外层循环继续进行,并且跳出视为完成一次内循环,i1

 

#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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值