题目大意:
给定N个字符串,求它们的公共后缀.如果不存在公共后缀,则输出"nai" 。
思路:
1.将所有输入的字符串逆置,并同时统计每个字符串的长度,保存所有字符串的最小长度。(防止遍历的时候越界)
2.对从第1个到第n个字符串的每一个字符都与第0个字符串的相同位置的字符比较,相同则为公共后缀的部分,
,同时设置变量ans保存公共字串的长度。一旦出现不同,立即退出循环。
3.判断ans是否大于0,如果不是,倒序第0个字符串的前ans个字符,如果不是,则证明没有公共后缀,输出"nai"。
注意:
1.scanf输入的时候遇到空格会结束,本题要求空格也算字符,需要手动令scanf的结束符为\n。
2.每输入一次,都需要getchar(),在输出的循环中,getchar要在scnaf的后面,否则最后一个case通不过。
AC代码:
#include<cstdio>
#include<cstring>
using namespace std;
int n, minLen = 256, ans = 0;//ans保存公共子串的长度
char s[110][256];
int main() {
(void)scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++) {
(void)scanf("%[^\n]", s[i]);
getchar();
int len = strlen(s[i]);
if (len < minLen) minLen = len;//记录最小的串的长度,防止越界
for (int j = 0; j < len / 2; j++) {
char temp = s[i][j];
s[i][j] = s[i][len - j - 1];
s[i][len - j - 1] = temp;
}
}
for (int i = 0; i < minLen; i++) {
char c = s[0][i];
bool same = true;
for (int j = 1; j < n; j++) {
if (c != s[j][i]) {
same = false;
break;
}
}
if (same == true) ans++;//如果所有字符串的第i位相等,则计数器ans++。
else break;
}
if (ans != 0) {
for (int i = ans - 1; i >= 0; i--) {
printf("%c", s[0][i]);
}
}
else printf("nai");
return 0;
}