1. 程式人生 > >ZZULIOJ 2500: 建國與迴文串

ZZULIOJ 2500: 建國與迴文串

題目描述

    建國最近學習了字串,他對迴文串很感興趣(迴文串是一個正讀和反讀都一樣的字串,比如“level”或者“noon”等等就是迴文串),而且建國非常喜歡偶數,並把長度為偶數的迴文串成為完美迴文串,現在建國想請你判斷一個字串能否有兩個完美迴文串拼接組成,如果可以輸出"Yes",否組輸出"No"。

輸入

第一行輸入一個整數T,表示樣例數量。(1 <= T <= 8)
接下來T行,每行輸入一個字串長度s。(s的長度小於或等於1000,s中輸入的字元均為小寫字母)

輸出

對於每個樣例,輸出"Case# x: y",x表示樣例序數(即表示當前是第x個樣例的輸出),y是你要給建國的答案(即"Yes" or "No")。

樣例輸入 Copy

2
abbacc
abccba

樣例輸出 Copy

Case# 1: Yes
Case# 2: No

提示

第一個樣例可以由abba, cc 兩個完美迴文串組成。 
第二個樣例無法由兩個完美迴文串組成。 

分析:本題只要暴力列舉判斷迴文子串,成立的輸出YES即可,有一點需要注意的是完美迴文子串的條件是長度必須是偶數,這個題利用substr()函式後使難度大大降低,感謝PK學長和ZHY學長對此題的講解!

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
bool check(string s)//判斷單個字串是否為完美迴文子串
{
	int n=s.length();
	if(n%2!=0)//字串長度為奇數的則直接篩掉
	return false;
	for(int i=0;i<=n/2;i++)
	{
		if(s[i]!=s[n-1-i])
		return false;//只要有一個對不上也直接篩掉
	}
	return true;//全部對上才可通過
}
int main()
{
	int t;cin>>t;
	for(int j=1;j<=t;j++)
	{
		string s;
		cin>>s;
		int len=s.length();
		bool flag=false;
		for(int i=1;i<len;i++)
		{
			string a=s.substr(0,i),b=s.substr(i,len-1);//關鍵點:利用substr()函式複製前字
			if(check(a)&&check(b))                //符串和後字串進入check()函式進行比對
			{
				flag=true;//如果兩個都是完美迴文子串則flag為true
				break;
			}
		}
		if(flag==true)//輸出對應的結果
		cout<<"Case# "<<j<<":"<<" Yes"<<endl;
		else
		cout<<"Case# "<<j<<":"<<" No"<<endl;
	}
}