問題描述:給定乙個字串 s,找到 s 中最長的回文子串。
列舉所有的子串,判斷是否為回文串,儲存最長的回文串。
class
solution
:def
longestpalindrome
(self, s)
: len_subs =
0 sub_huiwen =
""for i in
range(0
,len
(s))
:for j in
range
(i+1
,len
(s))
: sub_s = s[i:j+1]
if self.ispalindromic(sub_s)
and len_subs<
len(sub_s)
: len_subs =
len(sub_s)
sub_huiwen = sub_s
return sub_huiwen
defispalindromic
(self,sub_s)
:for i in
range(0
,int
(len
(sub_s)/2
)):if sub_s[i]
!= sub_s[
len(sub_s)
-i-1]:
return
false
return
true
if __name__ ==
'__main__'
:#s="abcabcbb"
#s = "abcdcba"
#s = "babad"
#s = "cbbd"
solution1 = solution(
) lenth_hw = solution1.longestpalindrome(s)
print
(lenth_hw)
我們知道回文串一定是對稱的,所以我們可以每次迴圈選擇乙個中心,進行左右擴充套件,判斷左右字元是否相等即可。
:# 當回文串的元素個數為奇數時它的中心在第i個元素上
len1 = self.expandaroundcenter(s, i, i)
# 當回文串的元素個數為偶數時它的中心在第i個元素和第i+1個元素之間
len2 = self.expandaroundcenter(s, i, i+1)
res_len =
max(len1, len2)
("start="
,start)
("end="
,end)
("res_len="
,res_len)
# 經過計算之後以i(或i和i+1)為中心的回文串的長度大於之前所有的回文串長度
# 之前最長的回文串的起始標籤為start,終止標籤為end
# 所以要更新start和end,來記錄新的最長回文串
if res_len > end - start +1:
# 以start開始,end結束的回文串長度為end-start+1
start =
int(i-
int(
(res_len-1)
/2))
#start在中心往左半回文串長度的位置
end =
int(i+res_len/2)
#end在中心往右半個回文串長度的位置
return s[start:end+1]
# 中心擴充套件核心
defexpandaroundcenter
(self,s, left, right)
: l = left
r = right
while l >=
0and r <
len(s)
and s[l]
== s[r]
: l -=
1 r +=
1return r-l-
1if __name__ ==
'__main__'
:#s = "abcdcba"
#s = "babad"
s ="cbbd"
solution1 = solution(
) lenth_hw = solution1.longestpalindrome(s)
(lenth_hw)
最長回文子串 LeetCode 五 最長回文子串
題目 最長回文子串 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。題目解析 回文?當回文串長度為奇數時,比如 北京計程車租出京北 當回文串長度為偶數的時候,比如 1221 以上兩種情況有乙個共同的特點就是有乙個中心,那在 中如何表示中心呢?class solution ...
leetcode 最長回文子串
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 中心拓展法 由乙個中心點開始向兩邊拓展,檢測邊界,判斷兩個值是否相等,相等則繼續拓展下去,檢測邊界。1....
最長回文子串(LeetCode)
給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb class solution def longestpalindrome self,s type s str r...