“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
一、题目描述
- 给你一个字符串
s,找到s中最长的回文子串。
二、思路分析
- 首先
回文子串的概念讲一下,就是两边是对称的(举个例子:上海自来水来自海上),左右是对称的吧!- 和Leetcode 4. 寻找两个正序数组的中位数一样也需要考虑字符串长度的奇数和偶数的情况。
- 长度为
奇数,从中间的数向两边扩散 - 长度为
偶数,需要从中间的两个数即第i个字符和i-1个字符向两边扩散
三、AC 代码:
class Solution {
//记录下标,用于截取回文子串返回
int [] range = new int[2];
public String longestPalindrome(String s) {
int n = s.length();
//长度为0或1的时候返回本身
if(n == 0||n == 1){
return s;
}
//将字符串转换为字符数组节省时间
char[]ss = s.toCharArray();
//i从1开始,因为只有1位的话本身就是回文串
for(int i = 1;i<n;i++){
//奇数的情况
helper(ss,n,i,i);
//偶数的情况
helper(ss,n,i-1,i);
}
//切割返回回文串
return s.substring(range[0],range[1]);
}
public void helper(char[]ss,int n,int start,int end){
//退出条件不能数组越界
while(start>=0&&end<=n-1)
if(ss[start] == ss[end]){
start --;
end ++;
}else{
break;
}
//如果当前长度比存储的长度大,则更新存储数组为最新的长度
if(end - (start+1)>range[1] - range[0]){
range[0]=start+1;
range[1] = end;
}
}
}
四、总结:
- 好了,代码撸完,我们
总结一下:- 这道题其实有两种解法,其一是本文所记录的
中心扩散法,其二是动态规划,后面会写 - 要注意
字符串长度奇数偶数两种不同的情况 - 细节,要注意
不包含start,所以start需要减一,substring函数截取是不包含最后一位的所以end不需要减
- 这道题其实有两种解法,其一是本文所记录的