题目:
给你一个字符串
s
,找到s
中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串
思路:
从下标为零开始遍历字符串,对于字符串的每一个“点”,采用中心扩散法。即从每一个位置出发,向两边扩散,遇到不是回文时结束。
假设当前在字符串的位置“i”,字符串为“acdbbdaa”:
1.先向左边扩散,寻找与当前位置(i)相同的字符,直到遇到不相同的为止;
2.再向右边扩散,寻找与当前位置(i)相同的字符,直到遇到不相同的为止;
3.接着双向扩散,直到左右不相等。如下图所示
因为我们最后要得到最长回文子串的起始下标,所以需要maxStart用于记录。len为遍历时每一轮的字串长度,maxlen为最大字串长度,当len>maxlen时需要更新maxlen。
Java代码如下:
class Solution {
public String longestPalindrome(String s) {
if(s==null || s.length() == 0){
return "";
}
int strlen = s.length();
int left = 0;
int right = 0;
int maxlen = 0;
int maxStart = 0;
int len = 1;
for(int i=0;i<strlen;i++){
left = i-1;
right = i+1;
while(left>=0 && (s.charAt(left) == s.charAt(i))){
left--;
len++;
}
while(right<strlen && (s.charAt(right) == s.charAt(i))){
right++;
len++;
}
while(left>=0 && right<strlen && s.charAt(left) == s.charAt(right)){
len = len + 2;
left--;
right++;
}
if(len>maxlen){
maxlen = len;
maxStart = left;
}
len = 1;
}
return s.substring(maxStart+1,maxStart+maxlen+1);
}
}
--小菜学习记录