题目:
给定一个字符串s,找出s中最长的回文子字符串。你可以假设s的最大长度是1000。
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Input: "cbbd" Output: "bb"
思路:
emmmmm自己的方法感觉有点傻囧,可以参考下别的博文
从左到右,依次判断以该数为中心是否存在回文子字符串,若存在,则与当前最长的回文字符串进行比较,更长则替换
在比较时有以下几个注意点:
1. 可注意到,在题目当中,将中心的重复字母视为一个大的部分,如abbbba,即使中间是偶数个b,也是算作回文,所以在判断以数为中心是否存在回文子字符串时,需要先遍历得到两个边界,即可能存在重复字符作为中间部分时,重复字符的左右两边的字符位置
2. 同1的原因,因此可以简化一些计算,如在abbbba中,在已经计算了第一个b之后,不需要再对其后面的b进行判断,因为在判断时,已经将其作为了一个部分,因此在计算了b之后,会直接计算最后的a位置
这个算法的结果是(似乎没有想象中的那么菜囧):
Runtime: 11 ms, faster than 61.00% of Java online submissions for Longest Palindromic Substring.
Memory Usage: 36.4 MB, less than 99.97% of Java online submissions for Longest Palindromic Substring.
代码:
class Solution {
public String longestPalindrome(String s) {
if(s.length()<=1) {
return s;
}
String sub = isPalindorme(s, 1);
for(int i=2;i<s.length();i++) {
if(s.charAt(i)!=s.charAt(i-1)) {
String newSub = isPalindorme(s, i);
if(newSub.length()>sub.length()) {
sub = newSub;
}
}
}
return sub;
}
public static String isPalindorme(String s,int loc) {
int left = loc-1;
int right = loc+1;
while(left>=0 && s.charAt(left)==s.charAt(loc)) {
left--;
}
while(right<s.length() && s.charAt(right)==s.charAt(loc)) {
right++;
}
while(left>=0 && right<s.length()) {
if(s.charAt(left)==s.charAt(right)) {
left--;
right++;
}else {
break;
}
}
return s.substring(left+1, right);
}
}