题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
很明显可以使用暴力破解,也可以使用动态规划,但是还是马拉车算法比较靠谱,但是我这里只是有了其一半不到的方式,
代码:只超过了近一半的提交
三种方法解决这个问题
动态规划实现的方法
具体的可以看看这个博客
马拉车算法的具体描述,挺详细的,我就直接搬运过来啦
class Solution {
public String longestPalindrome(String s) {
if(s.length() == 0 || s.length() == 1){
return s;
}
StringBuilder tem = new StringBuilder("#");
for (int i = 0; i < s.length(); i++) {
tem.append(s.charAt(i)).append("#");
}
// System.out.println(tem);
int start = 0;
int end = tem.length() - 1;
int result[] = new int[tem.length()];
result[0] = 1;
result[tem.length() - 1] = 1;
for (int i = 1; i < tem.length() -1 ; i++) {
start = i -1 ;
end = i + 1;
while (true) {
if(start >= 0 &&
end <= tem.length() - 1 &&
tem.charAt(start) == tem.charAt(end) ){
end ++;
start --;
}else {
result[i] = end - start + 1;
break;
}
}
}
// System.out.println(Arrays.toString(result));
//寻找result数组中的最大值,并且记录其下标,注意的是我们寻找的是除了第一个和最后一个的下标
int max = result[1];
int index = 1;
for (int i = 0; i < result.length - 1; i++) {
int j1 = result[i];
if(j1 > max){
max = j1;
index = i;
}
}
//接下来得到数组中的原来元素,得到返回值
//前半部分下标
start = index - max / 2 + 1;
// System.out.println("star " + start);
// System.out.println("end " + end);
//后半部分下标
end = index + max /2 - 1 ;
StringBuilder temBuilder = new StringBuilder();
while (start <= end) {
if(tem.charAt(start) == '#'){
}else {
temBuilder.append(tem.charAt(start));
}
start ++;
}
return new String(temBuilder);
}
}