记录个人算法学习5:最长回文子串

57 阅读1分钟

问题描述

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


🌟解题思路

这道题的难度被定义为中等难度我还是挺意外的,因为我下意识就想到了解决方案

  1. 执行for循环
  2. 每次for循环时判断当前索引的最长回文字符串
  3. 最后判断最长的那个回文字符串

代码实现

function longestPalindrome(s) {
    if (s.length < 2) return s;

    let longest = '';

    for (let i = 0; i < s.length; i++) {
        // 寻找奇数长度的回文子串
        let palindrome1 = expandAroundCenter(s, i, i);
        // 寻找偶数长度的回文子串
        let palindrome2 = expandAroundCenter(s, i, i + 1);

        // 更新最长的回文子串
        if (palindrome1.length > longest.length) {
            longest = palindrome1;
        }
        if (palindrome2.length > longest.length) {
            longest = palindrome2;
        }
    }

    return longest;
}

function expandAroundCenter(s, left, right) {
    while (left >= 0 && right < s.length && s[left] === s[right]) {
        left--;
        right++;
    }
    return s.slice(left + 1, right);
}


总结

网上对这种从中间往两边双指针循环的方法叫做采用中心扩展算法