題目描述
給定乙個字串 示例s
,找到s
中最長的回文子串。你可以假設s
的最大長度為 1000。
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
輸入: "cbbd"
輸出: "bb"
要做這個題,首先要了解什麼是回文子串。回文子串:正讀和反讀都一樣的字串。比如:
level
,noon
,bd
就不是回文串
既然題目中要找出乙個字串的最長回文子串。那麼可以將問題劃分為三個小問題:(1):找出該字串的所有字串;(2):在所有子串中判斷找出回文串;(3):找出最長的回文子串
class
solution}}
return res;
}// 判斷字串是否是回文串
private
boolean
ispalindrome
(string s)
}return
true;}
}
時間複雜度:o(n^3)
;空間複雜度:o(1)
。這種情況極其容易超時
中心擴充套件法是暴力迴圈法的優化。暴力迴圈法對於每乙個子串都進行了回文串的判斷。回文子串就是正讀和反讀都一樣,那麼我們可以從字串s的每個回文中心位置向兩邊擴充套件,擴充套件的時候來比較字元是否相同。
考慮到字串s的長度不確定,所以我們在回文中心擴充套件的時候應該考慮兩種情況:奇數或者偶數。
class
solution
}return s.
substring
(start, end +1)
;}// 在回文中心進行擴充套件
private
intexpandaroundcenter
(string s,
int left,
int right)
return right - left -1;
}}
時間複雜度:o(n^2)
;空間複雜度:o(1)
動態規劃的核心就是記住已解決問題的解。如果乙個回文串去掉首尾兩個字元,那麼得到的新的字串也是乙個回文串
基於此點,我嘗試著寫狀態轉移方程:
p (i
,j)=
p(i+
1,j−
1)∧(
si==
sj
)p(i,j)=p(i+1,j−1)∧(s i==s j)
p(i,j)
=p(i
+1,j
−1)∧
(si=
=sj)
即:當
s[i+1,j-1]
為回文串且s[i]==s[j]
的時候,s[i,j]
是回文串
class
solution
char
chars = s.
tochararray()
;// 3. 狀態轉移
// 注意:先填左下角
// 填表規則:先一列一列的填寫,再一行一行的填,保證左下方的單元格先進行計算
for(
int j =
1;j < len;j++
)else
else
}// 只要dp[i][j] == true 成立,表示s[i...j] 是否是回文串
// 此時更新記錄回文長度和起始位置
if(dp[i]
[j]&& j - i +
1> maxlen)}}
// 4. 返回值
return s.
substring
(begin,begin + maxlen);}
}
時間複雜度:o(n^2)
;空間複雜度:o(n^2)
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串
描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...
最長回文子串
輸入乙個字元,求出其中最長的回文子串。子串的含義是 在元串中連續出現的字串片段。回文的含義是 正看和倒看相同,如abba和yyxyy,在判斷時候應該忽略所有的空格和標點符號,且忽略大小寫,但輸出應該保持原樣,輸入的字元長度不超過5000,且佔據單獨一行,輸出最長的回文子串 如有多個,輸出,起始位置最...