九度筆記之 1252 回文子串

2021-12-29 22:24:03 字數 1822 閱讀 1034

題目描述:

輸入乙個字串,輸出該字串中對稱的子字串的最大長度。

比如輸入字串「google」,由於該字串裡最長的對稱子字串是「goog」,因此輸出4。

輸入:存在多組資料,每組資料一行字串,長度不大於100。

輸出:輸出回文子串的最大長度。

樣例輸入:

google

樣例輸出:

演算法分析:

本來打算用《最長合法括號序列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以內。輸出...