LeetCode 5 最長回文子串

2021-10-23 14:18:51 字數 1427 閱讀 6307

dp[i][j]表示子串s[i...j]是否是回文串,有如下遞推式.

d p[

i][j

]=dp

[i+1

][j−

1]an

ds[i

]=s[

j]dp[i][j]=dp[i+1][j-1] \ and \ s[i]=s[j]

dp[i][

j]=d

p[i+

1][j

−1]a

nds[

i]=s

[j]即如果s[i+1...j-1]是乙個回文串,同時s[i]==s[j],則s[i...j]也是乙個回文串,初始化所有的dp[i][i]dp[i][i+1],然後根據公式遞推求解.

時間、空間複雜度均為 o(n

2)o(n^2)

o(n2).

class solution }}

string ans="";

for(int i=le;i<=ri;++i) ans+=s[i];

return ans;}};

區間dp的方法中,初始狀態也就是邊界狀態為長度為 1 的子串和長度為 2 的子串,我們可以列舉所有的初始狀態,然後從初始狀態開始,不斷向左右兩邊擴充套件,直到當前的字串不再是回文串為止,後續的子串也不可能是回文串了.

時間複雜度依然是 o(n

2)o(n^2)

o(n2

),空間複雜度為 o(1

)o(1)

o(1)

.

class solution 

j=0;

while(i-j>=0 && i+j+1mx)

}string ans=s.substr(le,ri-le+1);

return ans;}};

使用 manacher 演算法可以快速求出以每個字元為中心,最大回文子串的長度. 時間、空間複雜度均為 o(n

)o(n)

o(n)

.演算法細節見 manacher演算法詳解

class solution 

return res;

}void manacher(string s)}}

string longestpalindrome(string s)

}string ans="";

for(int i=id-p[id]+1;i

LeetCode5最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...

LeetCode 5 最長回文子串

問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...

leetcode5 最長回文子串

遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...