5. Longest Palindromic Substring 最长回文子串
https://leetcode.com/problems/longest-palindromic-substring/
Medium | 2021-01-10 @threepotatox
https://leetcode-cn.com/problems/longest-palindromic-substring/
中等 | 2021-01-10 @有三只土豆
题目大意:
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
- 1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
设计思路:
假设每个字符都是回文中心,然后以中心向两边延伸,寻找最大回文子串。
如果有多个连续相同的字符,我们只需要把这些字符看作一个整体,当作回文的中心。因为多个连续相同的字符一定是回文子串,并且可以当作其他回文子串的中心。
又因为长度为偶数时,回文中心一定至少有两个连续相同的字符,所以奇数长度、偶数长度不需要区分。
关键词:最长回文子串,中心扩展法
Java 版:
class Solution {
public String longestPalindrome(String s) {
if (s == null) {
return "";
}
int len = s.length();
if (len < 2) {
return s;
}
int maxLen = 0;
int head = 0;
int n = len - 1;
for (int i = 0; i < n; i++) {
int left = i;
int right = left + 1;
while (right < len && s.charAt(left) == s.charAt(right)) {
right++;
}
left--;
while (left >= 0 && right < len && s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
left++;
if ((right - left) > maxLen) {
maxLen = right - left;
head = left;
}
}
return s.substring(head, head + maxLen);
}
}