前言
数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有
写出高质量代码的潜意识
。
一、问题描述
给你一个字符串 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. 最长回文子串
好了,本篇 力扣-最长回文子串
到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。