求所给字符串最长的相同后缀
Java
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(true){
int n = sc.nextInt();
if(n == 0) break;
String[] strs = new String[n];
for(int i=0; i<n; i++)
strs[i] = sc.next();
String res = "";//每次会创建并复制原串,计算量较大
//StringBuilder res = new StringBuilder("");//比较省时,速度较快
for(int i=0; i<strs[0].length(); i++){ //用i枚举后缀长度
char c = strs[0].charAt(strs[0].length()-1-i);//获取第一个串倒数第i个字符
boolean flag = true; //表示其余串是否与第一串有相同后缀
for(int j=1; j<n; j++){ //其余串逐个与第一串比较
if(i>=strs[j].length() || strs[j].charAt(strs[j].length()-1-i)!=c){
flag = false; //当其余串比公共后缀小,或后缀有字符不同时退出
break;
}
}
if(flag) res = c+res; //把新字符加到后缀前
//if(flag) res.append(c);//在后缀末尾加新字符(不会重新创建字符串)
else break;
}
//res.reverse();//翻转一下后缀
System.out.println(res);
}
}
}
C++
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n, n)
{
string s[n];
for(int i=0; i<n; i++) cin>>s[i];
int i;
for(i = s[0].size(); i; i--){
string c = s[0].substr(s[0].size()-i);//从最长后缀开始比较,逐次减少字符
int k = 0;//用于计算有相同后缀的个数
while(k<n){ //逐个枚举其余串与第一个串比较
//如果枚举到的串比第一个串后缀短,或者两串的后缀不同,退出循环不再比较
if(s[k].size()<i || s[k].substr(s[k].size()-i)!=c) break;
k++; //如果相等则计数加一
}
if(k==n){ //如果计数与总串数相同,输出最长公共后缀
cout<<c<<endl;
break;
}
}
if(!i) cout<<endl; //i相当于公共后缀的最大长度,当i为0时说明所有串都没有相同的后缀
}
}