题目
5. 最长回文子串
难度中等5210收藏分享切换为英文接收动态反馈
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。
示例 2:
输入: s = "cbbd"
输出: "bb"
提示:
1 <= s.length <= 1000s仅由数字和英文字母组成
解法1:
public String longestPalindrome(String s) {
String res = s.substring(0, 1);
String tempStr = res;
for (int i = 1; i < s.length(); i++) {
int j = 1;
int midIsTwo = s.charAt(i) == s.charAt(i - 1) ? 1 : 0;
if (midIsTwo == 1) {
tempStr = s.substring(i - 1, i + 1);
}
while (true) {
if (i - j - midIsTwo < 0 || i + j >= s.length()) {
break;
}
if (s.charAt(i - j - midIsTwo) == s.charAt(i + j)) {
tempStr = s.substring(i - j - midIsTwo, i + j + 1);
j++;
} else {
break;
}
}
if (res.length() < tempStr.length()) {
res = tempStr;
}
}
/**
思路:
babad为例,依次遍历每个字符,依次往左右继续遍历,看其是否相等
但只能满足中间只有一个字符的情况,如果中间多个字符相同则失效,比如abba,所以还需要判断中间2个字符相等的情况,于是有了上面的for循环。
*/
for (int i = 1; i < s.length(); i++) {
int j = 1;
while (true) {
if (i - j < 0 || i + j >= s.length()) {
break;
}
if (s.charAt(i - j) == s.charAt(i + j)) {
tempStr = s.substring(i - j, i + j + 1);
j++;
} else {
break;
}
}
if (res.length() < tempStr.length()) {
res = tempStr;
}
}
return res;
}
解法2:暴力
先枚举所有可能的子串,再判断子串是否是回文字符串,复杂度为O(N^3)
public String longestPalindrome(String s) {
String res = "";
int len = s.length();
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len + 1; j++) {
String substring = s.substring(i, j);
if (isHuiwen(substring) && res.length() < substring.length()) {
res = substring;
}
}
}
return res;
}
private boolean isHuiwen(String s) {
// aba bb bbb bbbb
int len = s.length();
if (len % 2 == 1) {
return s.substring(0, len / 2).equals(new StringBuilder(s.substring(len / 2 + 1)).reverse().toString());
} else {
return s.substring(0, len / 2).equals(new StringBuilder(s.substring(len / 2)).reverse().toString());
}
}