題目描述:
輸入乙個字串,輸出該字串中對稱的子字串的最大長度。
比如輸入字串「google」,由於該字串裡最長的對稱子字串是「goog」,因此輸出4。
輸入:存在多組資料,每組資料一行字串,長度不大於100。
輸出:輸出回文子串的最大長度。
樣例輸入:
樣例輸出:
演算法分析:
本來打算用《最長合法括號序列1》中的演算法,利用動態規劃做,但是對於例如「aaa」的情況該演算法就無效了
因為括號必須是左右一對同時出現,左邊的必為」(「,右邊的必為」)「,所以當出現str[pos]==」(」或 str[sympos]<0 或str[sympos]==」)」的情況時,str[pos]位置的符號不可能再和dp[pos-1]合法子括號序列的子字串構成合法括號序列。
對於回文字串,則會出現以下情況
aaa
dp[1]=2 ,
pos==2時,sympos== -1,得到dp[pos]=1 實際上dp[pos]=3
因為a[1]相當於乙個回文字串,str[0]==str[2],dp[pos]=3
abadabad
dp[6]=7,
pos==8時,sympos== -1,得到dp[pos]=1 實際上dp[pos]=5
因為abadaba中的子字串aba為乙個回文字串,str[3]==str[7],故dp[pos]=5
公共子串行查詢
新的思路就是,如果字串s中含有回文字串,回文字串一定為該字串的逆序列rs和該字串s的公共子串行,如下所示。
google s
elgoog sr
abamngnm s
mngnmaba sr
mngnmaba sr
演算法實現就很簡單了,從sr的某個位置開始,s從0開始逐個字元比較,記錄最長的公共序列。
源**:
程式中需要注意的是srbegin的每次迴圈,temlen都要重新置為0
srid的每次迴圈結束後,也要判斷一下temlen和maxlen的大小,
google s
elgoog sr
在sid==3,srid==5時,
sr.at(srid)==s.at(sid)
temlen++;
srid++;sid++;
迴圈退出,此時temlen==4,maxlen==0
還有就是考慮到sr需要前向錯位,後向錯位來比較,所以需要將s,sr反過來比較一下。參看int getmaxnum(std::string &s)
#include
#include
using namespace std;
int getmaxnum(std::string &s,std::string &sr)else
srid++;
sid++;
}//while(srid < slen)
if(temlen>maxlen) //attention srid==slen must be considered for "google"
maxlen = temlen;
srbegin++;
}return maxlen;}
int getmaxnum(std::string &s)
void test(){
std::string s = "ab";
std::string sr(s.rbegin(),s.rend());
std::cout<>s){
std::cout<
九度 題目1252 回文子串
題目描述 輸入乙個字串,輸出該字串中對稱的子字串的最大長度。比如輸入字串 google 由於該字串裡最長的對稱子字串是 goog 因此輸出4。輸入 存在多組資料,每組資料一行字串,長度不大於100。輸出 輸出回文子串的最大長度。樣例輸入 google 樣例輸出 4 回文子串,對稱性。在leetcod...
34 回文子串
總時間限制 1000ms 記憶體限制 65536kb 描述 給定乙個字串,輸出所有長度至少為2的回文子串。回文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如 abba,cccdeedccc都是回文字串。輸入乙個字串,由字母或數字組成。長度500以內。輸出輸出所有的回文子串,每個子串一行。子串...
34 回文子串
34 回文子串 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 65536kb 描述給定乙個字串,輸出所有長度至少為2的回文子串。回文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如 abba,cccdeedccc都是回文字串。輸入乙個字串,由字母或數字組成。長度500以內。輸出...