题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。 示例 2:
输入:s = "cbbd" 输出:"bb" 示例 3:
输入:s = "a" 输出:"a" 示例 4:
输入:s = "ac" 输出:"a"
解题思路
先来看别人的一张图
按照这种解法,首先想到三种情况
-
当前位和左边的元素相同
-
当前位与右边元素相同
-
当前元素与左边右边都不相同,但是当前元素的左元素和右元素是相同的
无非就是这三种情况,因此我们只需要在遍历字符串的每个元素的时候去判断他们的左右元素和本身的关系即可。
详细解释
-
先是遍历字符串中的每个元素
-
因为要用到左右元素,所以需要俩个索引去记录跟踪左右元素的位置left、right
-
第一类情况的时候左元素和本身相等但是为了防止数组下标越界因此需要判断此时的left是否是>=0的
-
第二类情况与第一类同理,第三类情况因为左右相等,本身元素夹在中间,所以长度需要+2
-
并且按照正常分析,第一种情况和第二种发生后有可能发生第三种情况,例如:abba,所以需要注意前俩类需要放在最后一类前方
-
接下来因为我们最后需要返回最长的回文字符串,所以我们需要将每个对应的字符串记录下来,然后通过比较他们的长度去保留最长的一个
-
因此我们需要将当前的回文字符串长度与之前的最长的回文字符串长度比较,保留长的,然后记录下此时的数组左索引或右索引。
代码
class Solution {
public String longestPalindrome(String s) {
int left = 0;
int right = 0;
int length = 1;
int maxLength = 0;
int curLeftIndex = 0;
for(int i = 0;i < s.length();i++){
left = i - 1;
right = i + 1;
while(left >= 0 && s.charAt(i) == s.charAt(left)){
length = length + 1;
left = left - 1;
}
while(right < s.length() && s.charAt(i) == s.charAt(right)){
length = length + 1;
right = right + 1;
}
while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
length = length + 2;
left = left - 1;
right = right + 1;
}
if(length > maxLength){
maxLength = length;
curLeftIndex = left;
}
length = 1;
}
return s.substring(curLeftIndex + 1,curLeftIndex + maxLength + 1);
}
}
后面会补充动态规划方法的做法