ZZULIOJ 2500: 建國與迴文串
阿新 • • 發佈:2019-01-11
題目描述
建國最近學習了字串,他對迴文串很感興趣(迴文串是一個正讀和反讀都一樣的字串,比如“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; } }