LeetCode5-最长回文子串

题目描述

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:
输入:s = “babad”
输出:”bab”
解释:”aba” 同样是符合题意的答案。

示例 2:
输入:s = “cbbd”
输出:”bb”

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路

遍历所有字串

开始的思路是暴力求解,直接遍历字符串,将由每个字符开头的所有长度为 1、2、3… 的所有子串都拿出来,逐一判断,记下最大长度。思路简单,但是效率太低,测试用例的长度超过 100 个字符,直接超时。

双指针

遍历字符串中,使用两个指针,从当前字符开始,然后判断两个指针位置的字符是否相等。如果相等,则两个指针分别向前、向后移动一位,继续比较,直到两个指针处的字符不相等,记录下两个指针间的字符拼接的字符串。如果有向后的指针到达字符串结尾,则结束比较,后面不会再有更长的回文子串了。
后面发现这种方法只能处理长度为奇数的子串,会遗漏比如 “ABBA” 这种长度为偶数的回文子串。
于是在此基础上改进,遍历两遍字符串,分别处理两种情况。

代码实现

Java 代码实现如下:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static String maxLengthOfSubString(String s) {  
char[] charArray = s.toCharArray();
String r = "";
// 奇数个
for (int i = 0; i < charArray.length; i++) {
int p1 = i;
int p2 = i;
while (p1 >= 0 && p2 < charArray.length && charArray[p1] == charArray[p2]) {
p1--;
p2++;
}

String tmp = new String(charArray, p1 + 1, (p2 - 1) - (p1 + 1) + 1);
if (tmp.length() > r.length()) {
r = tmp;
}

if (p2 == charArray.length - 1) {
break;
}
}

// 偶数个
for (int i = 0; i < charArray.length - 1; i++) {
int p1 = i;
int p2 = i + 1;
while (p1 >= 0 && p2 < charArray.length && charArray[p1] == charArray[p2]) {
p1--;
p2++;
}

String tmp = new String(charArray, p1 + 1, (p2 - 1) - (p1 + 1) + 1);
if (tmp.length() > r.length()) {
r = tmp;
}

if (p2 == charArray.length - 1) {
break;
}
}

return r;
}

后续 LeetCode 的做题记录只记录一些个人感觉有难度或者是解法比较精妙的题。