難度 中等
給定乙個字串s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
解法一:動態規劃
dp(i, j)表示字串 s 的第 i 到 j 個字母組成的串是否為回文串, 則有狀態轉移方程為:
dp[i,i] = 1\\ dp[i,i+1] = (s_ == s_)\\ dp[i,j] = dp[i+1,j-1] \lambda (s_ == s_) \end\right.
⎩⎨⎧dp
[i,i
]=1d
p[i,
i+1]
=(si
==s
j)d
p[i,
j]=d
p[i+
1,j−
1]λ(
si=
=sj
)我們依次從長度較短的字串向長度較長的字串進行轉移(即間隔 interval從 0 依次增加 len - 1)
class
solution
//間隔為 1 時,含 2 個字元, 只需要判斷 i , j 位置的字元是否相同
else
if(interval ==1)
else
//當第 i 到 j 個字母組成回文串, 且長度(interval + 1)大於之前儲存的回文串時, 更新 ans
if(dp[i]
[j]==
1&& interval +
1> ans.
length()
)}}return ans;
}}
解法二:中心擴充套件演算法
由上述的狀態轉移方程可得,所有的狀態在轉移的時候的可能性都是唯一即p(i,j) ← p(i+1,j−1) ← p(i+2,j−2) ← ⋯ ←邊界
, 因此我們列舉每乙個回文中心,然後從回文中心向兩邊擴充套件,來獲取從該回文中心擴充套件所得回文串的長度,並更新最大回文串的長度。
class
solution
int start =
0, end =0;
//列舉每乙個回文中心
for(
int i =
0; i < s.
length()
; i++)}
return s.
substring
(start, end +1)
;}private
intexpandaroundcenter
(string s,
int left,
int right)
return r - l -1;
}}
每日一題 最長回文串
給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。在構造過程中,請注意區分大小寫。比如 aa 不能當做乙個回文字串。注意 假設字串的長度不會超過 1010。輸入 abccccdd 輸出 7 解釋 我們可以構造的最長的回文串是 dccaccd 它的長度是 7。將字串轉換為列表...
每日一題2 最長回文串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 要判斷乙個字串是不是回文串有點難,但如果知道它的字串是回文串,再結合新進去的字元是否符合要求,就可以只...
每日一題 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 取反轉字串,與原字串對比 例 aebcbe 第一大輪 第一小輪 aebcbe 與 ebcbea比較 第...