PAT A1077 Kuchiguse 对着书打的,必须再做一遍 reverse在algorithm

//是对着书打的,边打边理解的,这题有必要再做一遍 
//ac了 
//reverse函数在algorithm.h
//如果用gets和getchar都记得用getchar吸收空格,之前一题诗getchar也要用getchar吸收空格 
#include<stdio.h>
#include<string.h>
int n,minlen=256,ans=0;
char s[100][260];//至多100个字符串,每个字符串至多256个字符
	
int main(){
	scanf("%d",&n);	
	getchar();//换行符要吸收掉!不然第一个字符会被吞掉吧
	for(int i=0;i<n;i++){
		gets(s[i]);//不然这里就是一个空格吧! 
		int len=strlen(s[i]);
		if(len<minlen) minlen=len;//取最小长度,这个最后会变成最小的,在后面求公共子串时可以用这个最小的来做遍历的最大值 
		for(int j=0;j<len/2;j++){
			//反转字符串s[i],转化为求公共前缀
			char temp=s[i][j];
			s[i][j]=s[i][len-j-1];//交换str[i]与str[len-i-j]
			s[i][len-j-1]=temp; 
		}//完成了一个字符串的反转  
	}
	for(int i=0;i<minlen;i++){//判断所有字符串的第i个字符是否全部相等 
		//对于第一个字符串的每一个字符,与下面的1~n-1个字符串的该位置字符对比 
		char c=s[0][i];//取第一个字符串的i号字符
		bool same=true;//记得是在这里设置true 
		for(int j=1;j<n;j++){//从标号1~n-1看每一个的i号元素是不是相等 
			//判断其余字符串的第i个字符是否等于c
			if(c!=s[j][i]){
				//只要有一个不等,说明公共前缀到此为止,break退出循环 
				same=false;
				break; 
			} 
		}
		//注意考虑same为true的情况,最好把ans计数一下 
		if(same) ans++;//这样下面看有没有就清晰一点,也可以很好的包括进0的情况 
		else break;//如果samw为false,说明匹配结束,退出循环 
	}
	if(ans){
		//倒序输出公共字符串	
		for(int i=ans-1;i>=0;i--){
			printf("%c",s[0][i]); 
		}
	}
	else{
		printf("nai\n");//不存在公共前缀 
	} 
	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值