题目链接在此。
题意
给定N个字符串,求相同后缀并输出;若果没有后缀,则输出“nai”。
思路
为了方便,现将输入的字符串反转,这样问题就转变成求字符串的相同前缀了。
我们用min_len记录所有字符串的最小长度,之后枚举所有字符串在[0,min_len)内的字符,判断相同位置的字符是否相同,如果相同,则写入suffix[]字符数组(用整型变量num来控制suffix下标,即保存的字符个数),如果不同,则停止枚举即可。
最后判断num,num等于0则输出nai,否则倒序输出所有字符即可。
当然,也可以不需要把相同的字符放入suffix数组,只需要有一个变量在枚举的过程中记住前缀字符串的最大下标即可,这样之后也可以输出。
有些需要注意的地方在代码注释中已经标注。
AC代码
#include<stdio.h>
#include<string.h>
//倒转字符串
void Reverse(char str[], int len){
for(int i = 0; i < len/2; i++){
int temp = str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
}
int main(){
int N;
scanf("%d",&N);
getchar(); //吸收换行
char speak[101][257];
int min_len=257, len; //min_len保存N个字符串的最小长度
for(int i = 0; i < N; i++){
gets(speak[i]);
len = strlen(speak[i]);
Reverse(speak[i], len);
//更新min_len
if(len < min_len){
min_len = len;
}
}
//让每一个字符串的相同位的字符相比较
char suffix[257];
int num = 0, j;
for(int i = 0 ; i < min_len; i++){
for(j = 1; j < N; j++){
if(speak[j][i] != speak[j-1][i]) break; //不同,退出j循环
}
if(j == N){ //j循环正常退出,则speak[][i]位相同,写进suffix
suffix[num++] = speak[0][i]; //不能写成speak[j][i],此时j已经越界,第一维写成0~N-1都可以,因为相同
} else{ //j循环时break出来的,则i循环也break即可,因为不相同了
break;
}
}
//输出结果
if(num==0){ //没有suffix
printf("nai\n");
} else{ //有suffix ,倒序输出suffix数组
for(int i = num-1; i >= 0; i--){
printf("%c",suffix[i]);
}
}
return 0;
}