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...