5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
解答:
先上暴力法,遍历每个字串,判断其是最长的回文子串即可。
public String longestPalindrome(String s) {
//记录回文子串的最长长度
int maxLenth = 0;
//记录最长的回文子串
String ans="";
//遍历得到所有字串
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j <= s.length(); j++) {
//判断子串是否是回文
String substring = s.substring(i, j);
boolean flag = true;
for (int k = 0; k < substring.length() / 2; k++) {
if (substring.charAt(k) != substring.charAt(substring.length() - k - 1)) {
flag = false;
break;
}
}
//最长回文字串
if (flag && substring.length() > maxLenth) {
maxLenth = substring.length();
ans = substring;
}
}
}
return ans;
}
很显然这种方法是不可能通过OJ系统的,时间复杂度为 O(n^3)
我想了一下可以再改改,从遍历最长字串,然后遍历第二长字串,这样相较于上面的好处是题目要求最长回文字串,只要我们找到回文就可以返回了。
public static String longestPalindrome(String s) {
//第一次遍历最长,第二次遍历第二长,第n次遍历第n长
String ans = "";
for (int i = s.length(); i > 0; i--) {
for (int j = 0; j <= s.length() - i; j++) {
//每轮保持遍历子串的长度为i
String substring = s.substring(j, i+j);
//判断子串是否是回文
boolean flag = true;
for (int k = 0; k < substring.length() / 2; k++) {
if (substring.charAt(k) != substring.charAt(substring.length() - k - 1)) {
flag = false;
break;
}
}
//是回文直接返回即可
if (flag) {
return substring;
}
}
}
return ans;
}
勉强能通过(我太菜了):
题解的方法暂时没时间看,先挖个坑,等以后补充。