最长回文子串
mid
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
1
2
3
| 输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
|
示例 2:
1
2
| 输入:s = "cbbd"
输出:"bb"
|
中心扩散法
从每一个位置出发,向两边扩散即可。遇到不是回文的时候结束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| func longestPalindrome(s string) string {
var maxLen, maxLeftIndex int = 0, 0
for i := 0; i < len(s); i++ {
leftIndex := i
rightIndex := i
// 寻找回文中心相同部分
for leftIndex-1 >= 0 && s[leftIndex-1] == s[i] {
// 往左扩散 直到遇到与i不相等的字符为止
leftIndex--
}
for rightIndex+1 < len(s) && s[rightIndex+1] == s[i] {
// 往右扩散 直到遇到与i不相等的字符为止
rightIndex++
}
// 左右扩散
for leftIndex-1 >= 0 && rightIndex+1 < len(s) && s[leftIndex-1] == s[rightIndex+1] {
leftIndex--
rightIndex++
}
if rightIndex-leftIndex+1 > maxLen {
maxLen = rightIndex - leftIndex + 1
maxLeftIndex = leftIndex
}
}
return s[maxLeftIndex : maxLeftIndex+maxLen]
}
|
1
2
3
4
5
6
7
8
9
10
11
| class Solution:
def longestPalindrome(self, s: str) -> str:
maxl,max_len,n = 0,0,len(s)
for i in range(2*n-1):
l,r = i//2,i//2+i%2
while l>=0 and r < n and s[l]==s[r]:
if r-l+1>max_len:
maxl,max_len = l,r-l+1
l-=1
r+=1
return s[maxl:maxl+max_len]
|