給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是乙個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
class
solution
(object):
deflongestpalindrome
(self, s)
:"""
:type s: str
:rtype: str
"""for length in
range
(len
(s),-1
,-1)
:for index in
range(0
,len
(s)- length +1)
: sub_string = s[index:length + index]
if sub_string == sub_string[::
-1]:
return sub_string
暴力法採用雙指標兩邊夾,驗證是否是回文子串。
除了列舉字串的左右邊界以外,比較容易想到的是列舉可能出現的回文子串的「中心位置」,從「中心位置」嘗試盡可能擴散出去,得到乙個回文串。
中心擴散法的思路是:
列舉「中心位置」時間複雜度為 o(n),從「中心位置」擴散得到「回文子串」的時間複雜度為 o(n),因此時間複雜度可以降到 o(n^2)。
在這裡要注意乙個細節:回文串在長度為奇數和偶數的時候,「回文中心」的形式是不一樣的。
我們看一下乙個字串可能的回文子串的中心在**?
我們可以設計乙個方法,相容以上兩種情況:
1、如果傳入重合的索引編碼,進行中心擴散,此時得到的回文子串的長度是奇數;
2、如果傳入相鄰的索引編碼,進行中心擴散,此時得到的回文子串的長度是偶數。
class
solution
(object):
deflongestpalindrome
(self, s)
:"""
:type s: str
:rtype: str
"""size =
len(s)
if size <2:
return s
# 至少是 1
max_len =
1 res = s[0]
for i in
range
(size)
: palindrome_odd, odd_len = self.__center_spread(s, size, i, i)
palindrome_even, even_len = self.__center_spread(s, size, i, i +1)
# 當前找到的最長回文子串
cur_max_sub = palindrome_odd if odd_len >= even_len else palindrome_even
lenn =
len(cur_max_sub)
if lenn > max_len:
max_len = lenn
res = cur_max_sub
return res
def__center_spread
(self, s, size, left, right)
:"""
left = right 的時候,此時回文中心是乙個字元,回文串的長度是奇數
right = left + 1 的時候,此時回文中心是乙個空隙,回文串的長度是偶數
"""i = left
j = right
while i >=
0and j < size and s[i]
== s[j]
: i -=
1 j +=
1return s[i +
1:j]
, j - i -
1
最長回文子串 最長回文子串行
1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...
最長回文子串 leetcode筆記
public static string longestpalindrome string s 定義最長子串的座標 int start 0,end 0 遍歷字串,以每個字元和字元的間隙為起點,進行中心擴充套件 for int i 0 i s.length i 返回子串 注意substring 方法 ...
最長回文子串
描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...