力扣刷题-最长回文子串

简介: 力扣刷题-最长回文子串

题目

给你一个字符串 s,找到 s 中最长的回文子串。

输入: s = "babad"
输出: "bab"
解释: "aba" 同样是符合题意的答案。

题解

我们这里使用一个叫做从中心扩散的思想,这个思想是指我们遍历字符串中的每一个字符,我们这里把字符串中的第二个字符a作为起点,把它当他当成一个中心,往两边扩散,并且检查它的左边和右边的字符是否相等,如果相等的话,这就是我们找到的回文字符串,然后再向两边扩散,在进行判断a字符左右两边各相隔一个字符的2字符是否相亲,如果相等在扩散,如果不相等则停止更换中心起点,以此往复,并不是所有的回文字符串都有一个中心点,有的回文字符串有中心的,有的回文字符串则没有中心点,所以我们需要处理这两种情况,首先我们写一个判断条件,判断当前传入的字符长度是否小于2,如果小于2则直接放回原字符串,在定义两个变量,start变量存储于当前找到的最大回文字符串的起始位置,maxLength记录了最大回文字符串的长度,终止位置也就是start变量加上maxLength变量,每次我们找到一个更大的回文字符串都需要更新一下start变量和maxLength变量的值,然后在创建一个helper函数,作用域判断左边和右边是否越界,越界则停止,同时判断最左边的字符串是否等于最右边的字符,如果以上三个字符的三个条件都满足,则判断是否需要更新回文字符串中最大长度以及最大字符的起始位置,然后继续向两边扩散,直到不满足三个条件之一停止,我们在进行遍历字符串时需要调用helper函数两遍,第一遍是检查中心点的左右两边的字符是否越界和是否相等,第二遍是检查中心点和右边的字符是否越界和是否相等

var longestPalindrome = function(s) {
 if(s.length<2){
     return s;
 }
 //maxLength是处理两个字符的情况,每个单个字符都可以被当做一个回文字符串,所以长度初始化为1
 let start=0,maxLength=1;
 function helper(left,right){
     while(left>=0&&right<s.length&&s[left]===s[right]){
         if(right-left+1>maxLength){
             maxLength=right-left+1
             start=left
         }
         left--;
         right++;
     }
 }
 for(let i=0;i<s.length;i++){
     helper(i-1,i+1)
     helper(i,i+1)
 }
 return s.substring(start,start+maxLength)
};
相关文章
|
1天前
leetcode代码记录(最长回文子串
leetcode代码记录(最长回文子串
8 2
|
1天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
1天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0
|
1天前
|
算法
【刷题】 leetcode 面试题 08.05.递归乘法
递归算法是一种在计算机科学和数学中广泛应用的解决问题的方法,其基本思想是利用问题的自我相似性,即将一个大问题分解为一个或多个相同或相似的小问题来解决。递归算法的核心在于函数(或过程)能够直接或间接地调用自身来求解问题的不同部分,直到达到基本情况(也称为基础案例或终止条件),这时可以直接得出答案而不必再进行递归调用。
25 4
【刷题】 leetcode 面试题 08.05.递归乘法
|
1天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
1天前
|
存储 算法 测试技术
|
1天前
|
算法 C语言 C++
|
1天前
|
存储 算法 C语言
C语言刷题~Leetcode与牛客网简单题
C语言刷题~Leetcode与牛客网简单题
|
1天前
刷题之Leetcode160题(超级详细)
刷题之Leetcode160题(超级详细)
13 0