最長回文子串

2021-07-03 16:06:22 字數 1424 閱讀 4937

簡單來說,就是順著和逆著讀相同的子串;例如erabcba的最長回文串是abcba

方法一:

動態轉移方程:p[i][j]記錄i—j是否為回文串(true false),p[i][j]=p[i-1][j-1](if a[i]==a[j]);

列舉子串的長度l,通過對每個字元開始l長的子串判斷是否為回文串;

同時注意單個字元的回文串是;且若相鄰兩個字元相同,則這兩個字元的回文串是2;以上兩種情況要單獨在初始化的時候考慮。

輸出回文串,要用max去記住當前最長的回文串長度,start記住最長回文串的起始位置;

int huiwen1(string a)

//動態規劃演算法,列舉的是長度從小到大;動態轉移方程:(p[i][j]=0如果ij不是回文串)p[i+1][j-1]=1且a[i]=a[j]則p[i][j]=p[i+1][j-1]

//時間複雜度o(n^2),空間複雜度o(n^2)

; //p記錄以i開始j結尾的子串是不是回文串

int max = 0;//記錄最長的回文串長度

//要考慮乙個字母是自己的回文,兩個字元相等的話回文長度為2;故長度=1、2的子串要單獨討論

for (int i = 0; i < len; i++)

for (int i = 1; i < len; i++)

}//從長度為3的子串開始遍歷

for (int l = 3; l <= len; l++)//考慮長度為l的子串}}

for (int t = start; t < start + max; t++)

cout << a[t] << " ";

cout << endl;

cout << "最長子串長度:" << max << endl;

return max;

}

方法二:中心擴充套件——列舉的是字串的中心,不斷的往兩邊擴充套件比較,只需要用max來記住當前最長的回文串長度。

int huiwen2(string a)//中心擴充套件法,列舉的是每乙個座標,算以這個座標為中心能向兩邊擴充套件的最大長度

//時間複雜度o(n^2) 空間複雜度o(1)

//偶數情況

l = i; r = i + 1;//考慮連續兩個相同字元的情況

while ((l >= 0) && (r < a.length()) && (a[l] == a[r]))

}for (int t = start; t < start + max; t++)

cout << a[t] << " ";

cout << endl;

cout << "最長回文子串長度:"

<< max

<< endl;

return

max;

}

方法三:manchester

參考:

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...

最長回文子串

輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...