PAT A1077 Kuchiguse

前言

傳送門

正文

在這裏插入圖片描述

思路

題意是讀入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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章