//是对着书打的,边打边理解的,这题有必要再做一遍
//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;
}
PAT A1077 Kuchiguse 对着书打的,必须再做一遍 reverse在algorithm
最新推荐文章于 2022-01-05 16:29:38 发布