前言
正文
思路
題意是讀入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;
}