PAT A1077
题意:
找出n个字符串的最长公共后缀
思路分析
在输入字符串的过程中,求得前一个字符串的长度len1,求得当前字符串的长度len2,而后分别从两个字符串的末尾向前枚举比较,并且记录后缀的长度,就这样两两比较,直到输入完毕。这样最终就获得了最长公共后缀长度index。
获得了最长公共后缀长度index后,设最后一个字符串的长度为len,则从len-index
处开始向后枚举所有的字符即可。
注意点
- 因为每个字符串可能存在空格,所有不能简单实用
scanf("%s")
去输入,而是使用fgets(buf,maxn,stdin)
输入完整的一行 - 注意一旦两两比较的字符串的最大公共后缀长度index=0,则设置标记flag为false,这样最后输出时直接输出
nai
即可。
该程序的时间复杂度为O(n*len),len最大可以取到256
参考代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stdio.h>
using namespace std;
const int maxn = 110;
char buf[maxn][260];
int main(void){
int n;cin>>n;
bool flag = true; //默认存在相同后缀
int index;
getchar(); //消除回车的影响
for(int i = 0;i < n;i++) {
index = 0;
fgets(buf[i],260,stdin);
if(i > 0) {
int len1 = strlen(buf[i-1]) - 1;
int len2 = strlen(buf[i]) - 1;
for(int x = len1-1,y = len2 - 1;x >= 0 && y >= 0;x--,y--) {
if(buf[i-1][x] == buf[i][y])
index++;
else break;
}
if(index == 0) {
flag = false;
}
}
}
if(flag == false) printf("nai");
else {
int len = strlen(buf[n-1]) - 1;
for(int i = len - index;i < len;i++) {
printf("%c",buf[n-1][i]);
}
}
return 0;
}