資料結構演算法題 最長回文子串

2021-08-30 11:06:39 字數 1444 閱讀 6542

回文表示字串正向和反向是相同的。例如a, aba, abccba

最容易想到的就是暴力破解,求出每乙個子串,之後判斷是不是回文,找到最長的那個。

求每乙個子串時間複雜度o(n^2), 判斷子串是不是回文o(n),兩者是相乘關係,所以時間複雜度為o(n^3)。

下面介紹動態規劃的方法,使用動態規劃可以達到最優的 o(n2) 複雜度。

令 dp[i][j] 表示 s[i] 至 s[j] 所表示的子串是否是回文子串,是則為 1,不是則為 0。這樣根據 s[i] 是否等於 s[j] ,可以把轉移情況分為兩類:

若 s[i] == s[j],那麼只要 s[i+1] 至 s[j-1] 是回文子串,s[i] 至 s[j] 就是回文子串;如果s[i+1] 至 s[j-1] 不是回文子串,則 s[i] 至 s[j] 也不是回文子串。

若 s[i] != s[j],那麼 s[i] 至 s[j] 一定不是回文子串。    

根據遞推寫法從邊界出發的原理,注意到邊界表示的是長度為 1 和 2 的子串j=i表示長度為1的,i-j=1表示長度為2的,且每次轉移時都對子串的長度減了 1,因此不妨考慮按子串的長度和子串的初始位置進行列舉,即第一遍將長度為 3 的子串的 dp 值全部求出,第二遍通過第一遍結果計算出長度為 4 的子串的 dp 值 

public class longestpalindromicsubstring 

else

if(dp[j][i] && maxlen <= i - j + 1)//j到i之間的子串是回文子串}}

return s.substring(start, start + maxlen);

}public static void main(string args)

}

中心擴充套件就是把給定的字串的每乙個字母當做中心,向兩邊擴充套件,這樣來找最長的子回文串。演算法複雜度為o(n^2)。

需要考慮兩種情況:

長度為奇數的回文串,比如a, aba, abcba

長度為偶數的回文串,比如aa, abba

public string longestpalindrome2(string s)

j--;

k++;}}

for(int i = 0; i < len; i++)//求長度為偶數的回文串

j--;

k++;}}

return s.substring(start, start + maxlen);

}

manacher演算法的時間複雜度為o(n),具體可參考:

資料結構之最長回文子串

leetcode刷題 題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 輸入 babad 輸出 bab 或 aba 輸入 cbbd 輸出 bb def longestpalindrome self,s str str slen len s 長度小於2或...

演算法 最長回文子串

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

程式設計題 最長回文子串

對於乙個字串,請設計乙個高效演算法,計算其中最長回文子串的長度。給定字串a以及它的長度n,請返回最長回文子串的長度。測試樣例 abc1234321ab 12返回 7 解題思路 法一 中心擴散法 時間複雜度o n 2 空間複雜度o n 遍歷每個字元,以該字元為中心,向前 後擴散,直到不滿足回文時停下。...