#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//二维字符数组的反转怎么实现?
//答:不一定要用另外一个字符数组来保存,直接拿一个临时变量来实现二维字符数组本身的变化即可,还有因为是
//二维字符数组,所以需要用到双循环;
//void reverseString(char str[i][],char ans[i][99])
//{
// int longString=strlen(str[i]);
// for(int j=0;j<longString;++j)
// {
// ans[][j]=str[i][longString-1-j];
// }
//}
/*
A1077 给定N个字符串,求它们的公共后缀,如果不存在公共后缀,则输出“nai“
*/
int main()
{
int num=0;
scanf("%d",&num);
getchar();//防止换行符被下个的gets函数读入,形成错误
char str[100][256]={{0}};//注意题目规定字符大小,否则会产生段错误
char temp;//字符变量可以直接保存字符串???答:不是用来保存字符串,而是用来保存字符,因为是一个一个字符进行逆置
int minStr=256;//记录最短字符串长度,注意因为是要求最小值,所以一开始赋值要赋值最大值,否则minStr永远是0
for(int i=0;i<num;++i){//二维字符数组这里第一个下标也应该从零开始
//scanf("%s",str[i]);//这里用gets比较好,因为字符串有可能有空格
gets(str[i]);
int longStr=strlen(str[i]);
if(longStr<minStr)minStr=longStr;
for(int j=0;j<longStr/2;++j){//循环条件要除以2,否则循环到后半部分,又重新逆置回来,整体看没产生影响
temp=str[i][j];
str[i][j]=str[i][longStr-1-j];
str[i][longStr-1-j]=temp;
}
}
int minSame=0;
for(int k=0;k<minStr;++k){
int flag=false;
for(int m=1;m<num;++m){//这里m应该从1开始,因为k=0就是用来比较的
if(str[m][k]==str[0][k]){
flag=true;//这里要用flag而不直接minSame++的原因是要判断全部的字符串的同一位置的字符都相等才能minSame++;
//如果直接minSame++会导致如果两个以上的字符串同一位置相等,则minSame会多加,导致结果错误
}
else{
flag=false;
break;
}
}
if(flag==true){
minSame++;
}
else break;//这个不能省略,因为可能存在如果不是有相同后缀,有部分相同中缀,如果没有break;也会使minSame++;
}
if(minSame==0){
printf("nai");//不存在公共后缀;
return 0;
}
for(int n=minSame-1;n>=0;--n){//这里应该逆序打印,因为求的是后缀,现在字符数组已经被逆转了
printf("%c",str[0][n]);
}
// 测试是否逆置有效
// for(int k=0;k<num;++k){
// printf("%s\n",str[k]);
// }
return 0;
}
A1077 给定N个字符串,求它们的公共后缀,如果不存在公共后缀,则输出“nai“
最新推荐文章于 2023-09-12 16:58:25 发布