原题
https://leetcode.cn/problems/longest-palindromic-substring/
思路
中心扩散法。遍历字符串在每个下标处尝试构建两种回文字符串(aa或者aba)。取最长的字符串长度。
复杂度
时间:O(n*n)
空间:O(1)
Python代码
class Solution:
def expandAroundCenter(self, s, left, right):
while left >= 0 and right <= len(s)-1 and s[left] == s[right]:
left -= 1
right += 1
return left+1, right-1
def longestPalindrome(self, s: str) -> str:
# 初始化
start, end = 0, 0
for i in range(len(s)):
l1, r1 = self.expandAroundCenter(s, i, i)
l2, r2 = self.expandAroundCenter(s, i, i+1)
if r1 - l1 > end - start:
start, end = l1, r1
if r2 - l2 > end - start:
start, end = l2, r2
return s[start:end+1]
Java代码
class Solution {
public String longestPalindrome(String s) {
int left = 0, right = 0;
for (int i = 0; i < s.length(); i++) {
int[] arr1 = expandAroundCenter(s, i, i);
int[] arr2 = expandAroundCenter(s, i, i+1);
if (arr1[1] - arr1[0] > right - left) {
left = arr1[0];
right = arr1[1];
}
if (arr2[1] - arr2[0] > right - left) {
left = arr2[0];
right = arr2[1];
}
}
return s.substring(left, right+1);
}
public int[] expandAroundCenter(String s, int l, int r) {
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
return new int[] {l+1, r-1};
}
}