題目描述:(最大回文序列)
Catcher是MCA國的情報員,他工作時發現敵國會用一些對稱的密碼進行通信,比如像這些ABBA,ABA,A,123321,但是他們有時會在開始或結束時加入一些無關的字符以防止別國破解。比如進行下列變化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因爲截獲的串太長了,而且存在多種可能的情況(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量實在是太大了,他只能向電腦高手求助,你能幫Catcher找出最長的有效密碼串嗎?
輸入描述:輸入一個字符串
ABBA
輸出描述:返回有效密碼的最大子串
4
做題思路:
遍歷整個字符串中的每一個字符,將其作爲某個迴文序列的中心字符,向兩側進行擴增。
以下標爲index的字符爲中心時,可以產生長度爲偶數的迴文序列和長度爲奇數的迴文序列:
長度爲偶數的迴文序列:index和index+1字符相同,長度爲1*2,繼續擴增index-1和index+2字符相同,長度爲2*2,繼續擴增index-len+1與index+len字符相同長度爲len*2,直至字符不同,不再擴增
長度爲奇數的迴文序列:index字符爲中心,只要考慮index-len與index+len是否相同,相同,len++繼續擴增,不同,就終止
比較得出當前字符偶數迴文和奇數迴文的最大值,作爲當前字符爲中心所能得到的迴文序列的最大值
最後比較所有字符各自的值,最大的就是整個字符串最大的值,輸出即可
AC代碼:
#include<iostream> #include<string> using namespace std; int oddPalindrome(string str,int index); //獲得以index處的字符爲中心,奇數迴文序列的最長值 例如ABA 把B當做中心 int evenPalindrome(string str,int index); //獲得以index處的字符爲中心,偶數迴文序列的最長值 例如ABBA 把第一個B當做中心 int main() { string str; while(cin >> str){ int max = -1; for(int index=0; index<str.size(); index++){ int max_odd = oddPalindrome(str,index); int max_even = evenPalindrome(str,index); max = max>max_odd?max:max_odd; max = max>max_even?max:max_even; } cout<<max<<endl; } } int oddPalindrome(string str,int index) //獲得以index處的字符爲中心,奇數迴文序列的最長值 例如ABA 把B當做中心 { int len = 0; for(int i=1; index+i<str.size()&&index-i>=0; i++){ if( str[index+i]==str[index-i] ){ len = i; }else{ break; } } return 2*len+1; } int evenPalindrome(string str,int index) //獲得以index處的字符爲中心,偶數迴文序列的最長值 例如ABBA 把第一個B當做中心 { int len = 0; for(int i=1; index+i<str.size()&&index-i+1>=0; i++){ if( str[index+i]==str[index-i+1] ){ len = i; }else{ break; } } return 2*len; }