Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识。
一、问题描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
二、解题思路
中心扩散法
如果是回文子串的话,那么一定左右两边是对称的。那么我们就可以使用两个指针向左右两边进行扩散,找到长的子串。但是回文子串也包含两种情况。
- 第一种:aba 这种长度为奇数的,中心就是从b开始扩散
- 第二种: bbaabb 这种长度为偶数的,中心就得从aa扩散 我们直接看代码吧,带有注释的代码还是比较好理解的。
三、AC代码
var longestPalindrome = function(s) {
if(s.length<2) return s // 如果长度为 0 | 1 直接返回
let res = '' // 存储最长的回文子串
for(let i=0;i<s.length;i++){ // 寻找所有以字母s[i]开头的回文子串,最后选最长的
helper(i,i) // aba 情况 两个指针指向中心节点即可
helper(i,i+1) // abba 情况
}
function helper (x,y){
// 只要两个指针指向的内容相同且不越界就不断找
while(x>=0&&y<s.length&&s[x]==s[y]){
x--
y++
}
// 注意 在退出while循环的时候,x和y都是进行了一次不满足条件的运算
// 例如 cabad x,y初始为 2指向b 退出的时候 x指向c y指向d
// 我们实际上需要的区间为 [x+1,y-1] slice 方法为左闭右开
if(y-x-1>res.length){
res = s.slice(x+1,y)
}
}
return res
};
四、总结
字符串问题寻找回文,最长子串问题,双指针和动态规划是常见的解题思路,一般理解好题目的意思,处理边界条件,在处理一些范围不太确定的问题时,可以采用带入法。带入某个条件我写的这个放法合不合适。
后续
- 地址: 5. 最长回文子串
好了,本篇 力扣-最长回文子串 到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。