暴力枚举
最长公共后缀
思路
找出最长的字符串,用最长字符串从最长后缀开始枚举
#include<cstdio>
#include<cstring>
const int N = 205;
char s[N][N];//读入的字符串
int len[N];//每个字符串的长度
int main()
{
int n;
while(~scanf("%d", &n) && n != 0)
{
//读入数据并找出最长的字符串
int index, inf = -1;
for(int i = 0; i < n; i++)
{
scanf("%s", s[i]);
len[i] = strlen(s[i]);
if(inf < len[i])
inf = len[i], index = i;
}
//用最长的字符串,从后缀起始位置为i,开始枚举
int i;
for(i = 0; i < len[index]; i++)
{
//处理长度为j的后缀是否为最长公共后缀
int k;
for(k = 0; k < n; k++)
{
if(k == index) continue;//跳过s[index]字符串本身
if(len[index]-i > len[k]) break;//后缀长度大于某个字符串时显然不是后缀
int u, v;
for( u = len[index]-1, v = len[k]-1; u >= i ;u--, v--)
if(s[index][u] != s[k][v]) break;//没有找到相同后缀
if(u >= i) break;//s[index][i, len)不是后缀
}
//如果找到后缀,输出后缀s[index][i, len),结束循环
if(k == n)
{
for(int r = i; r < len[index]; r++)
printf("%c", s[index][r]);
puts("");
break;
}
}
//没有公共后缀输入换行
if(i >= len[index]) printf("\n");
}
return 0;
}