最長回文串 演算法 4 求解最長回文子串

2021-10-12 18:27:16 字數 1653 閱讀 2900

問題描述:給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

注釋:回文通俗的說就是正著念和反著念都一樣,如:上海自來水來自海上。

示例 1:

輸入: ""dabccbac""

輸出: "abccba"

示例 2:

輸入: "cbbd"

輸出: "bb"

解題思路:

此處撰寫解題思路

遍歷每乙個索引,以這個索引為中心,利用「回文串」中心對稱的特點,往兩邊對稱的特點,往兩邊擴散,記錄最長能擴散的長度。

注意:回文串在長度為奇數和偶數的時候,「回文中心」的形式是不一樣的。

奇數回文串的中心是乙個具體的字元,例如:回文串 aba 的中心是字元 b ;

偶數回文串的中心是位於中間兩個字元的空隙,例如:回文串 abba 的中心是兩個 b 中間的那個空隙。

我們可以設計乙個方法,相容以上兩種情況:

1、如果傳入重合的索引編碼,進行中心擴散,此時得到的回文子串的長度是奇數;

2、如果傳入相鄰的索引編碼,進行中心擴散,此時得到的回文子串的長度是偶數。

**:

class solution {

public string longestpalindrome(string s) {

if(s == null || s.length()<1){

return "";

int start = 0, end = 0;

// 遍歷整個字串,將每個字元都從中心開始拓展

for(int i=0;i// 因為回文可能有兩種情況,奇數回文和偶數回文

// 奇數回文,最小的長度肯定是1,就是它自己,中心就是i

int len1 = expandaroundcenter(s,i,i);

// 偶數回文,最小長度可能位0,中心介於i和i+1之間

int len2 = expandaroundcenter(s,i,i+1);

// 比較奇數回文和偶數回文的長度,選擇最長的

int len = math.max(len1,len2);

// 如果長度比原來的長度長了,要記錄回文的下標

求解最長的回文子串

1.暴力法 找出所有子串,並且判斷是否是回文子串,並且記錄最長長度,演算法複雜度為o n 3 強烈不推薦。2.對稱求解法 遍歷字串每個位置,從每個位置向兩邊擴散,判斷是否對稱,演算法複雜度為o n 2 但是需要考慮長度為奇偶兩種情況。示例 public int longestpalindrome s...

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

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

演算法 最長回文子串

題目描述 對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。例如 輸入 abc1234321ab 12 返回值 7 最長回文子串 public static intgetlongestpalindrome string a,int n...