最長回文子串(動態規劃以及Manacher演算法)

2021-08-25 11:57:37 字數 989 閱讀 1219

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

示例 1:

輸入: "babad"

輸出: "bab"

注意: "aba"也是乙個有效答案。

示例 2:

輸入: "cbbd"

輸出: "bb"

自己的思路:求乙個字串的最長回文子串,我們可以將以每個字元為首的子串都遍歷一遍,判斷是否為回文,如果是回文,再判斷最大長度的回文子串。演算法簡單,但是演算法複雜度太高,o(n^3)

string longestpalindrome(string s)

}return s.substr(start,maxlength);//利用string中的substr函式來返回相應的子串,第乙個引數是起始位置,第二個引數是字元個數

}

很明顯上述的演算法複雜度太高,應該有更加快捷的做法來處理。下面介紹兩種方法

(1)dp

對於字串str,假設dp[i,j]=1表示str[i...j]是回文子串,那個必定存在dp[i+1,j-1]=1。這樣最長回文子串就能分解成一系列子問題,可以利用動態規劃求解了。首先構造狀態轉移方程

上面的狀態轉移方程表示,當str[i]=str[j]時,如果str[i+1...j-1]是回文串,則str[i...j]也是回文串;如果str[i+1...j-1]不是回文串,則str[i...j]不是回文串。

初始狀態

上式的意義是單個字元,兩個相同字元都是回文串。

string longestpalindrome(string s)

if (rd[i] - 1 > maxlen)

}return s.substr(start, maxlen);

}

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串s,求s的最長回文子串的長度 樣例 字串 patzjujztaccbcc 的最長回文子串為 atzjujzta 長度為9。動態規劃思想 令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不是為0。這樣根據s i 是否等於s j ...

動態規劃 最長回文子串

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 本題有很多種解法,最簡單的暴力求解,但是會超時。下面分別說明動態規劃法和中心擴散法。解法一 動態規劃法...

最長回文子串 動態規劃

給出乙個字串s,求s的最長回文子串的長度。樣例輸入 patzjujztaccbcc 輸出 9 尋找二維動態規劃表示式dp i j 如果直接用dp i j 表示子符串從s i 到s j 的最長回文子串長度無法得出遞推表示式。令dp i j 表示s i 至s j 所表示的子串是否是回文子串,是則為1,不...