最長回文子串 動態規劃

2022-06-02 23:06:16 字數 2020 閱讀 3393

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

示例1

輸入: "

babad

"輸出:

"bab

"注意:

"aba

" 也是乙個有效答案。

示例2

輸入: "

cbbd

"輸出: "bb

"

解法一: 暴力解法

根據回文子串的定義,列舉所有長度大於等於2的子串,以此判斷它們是否是回文.在具體實現中,可以只針對大於「當前得到的最長回文子串長度」的子串進行回文子串.下面我們用暴力解法,列舉出所有的,但是時間超出了限制,但是還是將這種方式貼出來

import foundation //

想要匯入,否則string無substring方法

func longestpalindrome(_ s: string) ->string

if s.count == 1

var maxlen: int = 1

let range = nsrange(location: 0, length: 1

) let result = (s as

nsstring).substring(with: range)

var resultstr = result as

string

for i in

0..1}}

return

resultstr}//

判斷回文

func valid(_ s: string, left1: int, right1: int) ->bool

left = left + 1

right -= 1

}

return

true

}

然後在leetcode上提交,但是時間超過了限制,給出的結果如下:

解法二: 動態規劃

解法一的時間複雜度過高,在leetcode上並不能ac.下面有改進方法

首先我們定義p(i,j) 如下 

接下來p( i , j ) = (p( i + 1,  j - 1 )&& s[ i ] == s[ j ])

所以如果我們知道了p( i, j )的情況,不需要呼叫判斷回文串的函式了,只需要知道p( i + 1,  j - 1 )的情況就可以了,這樣時間複雜度就會減少了o(n), 因此我們採取動態規劃的方案,用空間換取時間,把已經求出來的p(i, j)儲存起來.

如果s[i + 1, j -1]是回文串, 那麼只要s[i] == s[j] 就可以確定s[i, j]是回文串.

求長度為1和長度為2的p(i,j)時不能用上邊的公式,因為帶上去,發現越界,所以要分兩種情況考慮.

所以我們先初始化長度為1的回文串的p(i,j),利用上面的提出的公式,然後兩邊向外各擴充乙個字元,長度為3, 5的,所有的長度就求出來了.

同理, 初始化長度為2的回文串,利用公式,得到了長度為4, 6的所有偶數長度就都求出來了.

**如下:

class

solution

boolean p = new

boolean

[length][length];

int maxlen = 0;

string maxpal = "";

for (int i = 1; i <= length; i++) //

遍歷所有的長度

for (int j = 0; j < length; j++)

}return

maxpal;

}}

上面就是動態規劃方法,還會持續更新,希望大家關注!!!

動態規劃 最長回文子串

動態規劃 最長回文子串 題目描述 給出乙個字串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,不...