JS力扣刷题经典100题——最长回文子串

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

示例 1:

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

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

    1 <= s.length <= 1000
    s 仅由数字和英文字母组成

这题不看思路真做不出来。。。

  1. 理解题意
    • 题目给定一个字符串
    • 需要我们找到这个字符串中的最长回文串
    • 回文串:正着读和反着读都一样的字符串
  2. 整体思路
    • 我根据回文串的一个核心思想来解题:从中心点往两边扩散,来寻找回文串,这种方向相当于穷举每一个点为中心点
    • 如果回文串是奇数时,比如 "bab" ,它的中心点就只有一个 "a",所以从 "a" 开始向两边扩散
    • 如果回文串是偶数时,比如 "baab",它的中心点有两个 "aa",所以从 "aa" 开始向两边扩散
    • 编写一个辅助函数来寻找回文串,当中心点确定了之后调用辅助函数,直接返回找到的回文串
    • 将每次找到的回文串与之前的做对比,谁长就留谁
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let str = ""
    for(let i=0; i<s.length; i++){//abba
        //穷举中心点
        let subString1 = findHuiWen(s,i,i)
        let subString2 = findHuiWen(s,i,i+1)
        str = str.length > subString1.length ? str : subString1
        str = str.length > subString2.length ? str : subString2
    }
    return str
};
function findHuiWen(s, left, right){
    while(left >=0 && right < s.length) {
        if(s.charAt(left) == s.charAt(right)) {
            left--
            right++
        } else {
            break
        }
    }//执行结束left和right都回退一个,但是substring方法左闭右开[,),因此right保持不变
    return s.substring(left+1,right)
}

用到的知识点:

String.prototype.charAt()

 charAt() 方法从一个字符串中返回指定的字符。

str.charAt(index)

String.prototype.substring()

substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集,或从开始索引直到字符串的末尾的一个子集。

str.substring(indexStart[, indexEnd])

猜你喜欢

转载自blog.csdn.net/qq_36384657/article/details/128209457