前言
正文
思路
题意是读入N个字符串,输出这N个字符串最长的公共后缀子串,如果没有最长的公共后缀子串,则输出"nai",解决思路还是比较容易想到,主要注意一下坑点,cin>>对字符后面的残留在缓冲区的分隔符不做处理。举个例子
int a; string b; cin>>a>>b; cin>>a; getline(cin,b);
输入:1[enter]hello[enter] 如果是用cin>>a>>b输入的话,这样两个>>都会忽略字符前的分隔符的,结果为a=1,b=“hello”,但是如果是第二个输入的方式,则getline不会将1后面的[enter]忽略掉,它会将其读取到b中,因为是换行符,所以替换成’\0’,代表结束,则hello会被屏蔽,但是依然存放在缓冲区里,这个时候需要再来一个getline,hello就会被读取。
参考题解
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
题意是读入N个字符串,输出这N个字符串最长的公共后缀子串,
如果没有最长的公共后缀子串,则输出"nai",首先
使用getline(cin,str)逐行读入字符串,再将字符串翻转
,得出N个字符串中最长的字符串的长度len,再对每个字符串
进行逐个字符遍历,若是公共字符,则加入到字符串res中,
若res.size()!=0,则表示有公共字符,所以逆序输出res,否则
直接输出nai。易错点:这里需要注意cin>>输入时,对后面残留在缓冲区
的分割符不做处理,因此额外需要使用getline(cin,s) 来读入n后面的enter换行。
*/
int main(){
int n,lens[100],len=-1;
bool flag=false;
cin>>n;
string res,str[n],s;
getline(cin,s);//读掉enter键 ,也可cin.get()读取换行字符
for(int i=0;i<n;i++){
getline(cin,str[i]);//读取一行字符串
reverse(str[i].begin(),str[i].end());//翻转
lens[i]=str[i].size();
if(lens[i]>len)len=lens[i];//获取最长字符串的长度 (这个题直接改成获取最短的长度即可)
}
for(int i=0;i<len;i++){
char ch[n];
for(int j=0;j<n;j++){
//需要掌握这种常用技巧
ch[j]=i<lens[j]?str[j][i]:'0';
}
for(int k=0;k<n-1;k++){
if(ch[k]!=ch[k+1])//若相应位置字符不相同,则不是公共子串
flag=true;
}
if(flag==true){
break;
}else{
res+=ch[0];
}
}
reverse(res.begin(),res.end());//重新翻转回来
if(res.size()!=0)//有公共子串
cout<<res<<endl;
else cout<<"nai"<<endl;
return 0;
}