马拉车算法

9 阅读1分钟
  • 作用
    • 马拉车算法是解决最长回文子串问题的线性算法,也可以解决最长回文子串计数问题
  • 中心扩展算法
    • 模拟回文串的中心,根据回文串的对称性向它的两边逐个扩展,不断的判断左边和右边是否相等,直到扩展到最大的那个以某个中心为中心的回文串
    const longestPalindromicSubstring = s => {
        const sn = ["^", "#", ...[...s].join("#"), "#", "$"]
        let ans = 0
        for (let i = 1; i < sn.length - 1; i++) {
            let ext = 0
            while (sn[i - ext -1] == sn[i + ext + 1]) ext++
            if (ext > ans) = ans = ext
        }
        return ans
    }
    
  • 步骤
    • 在所有的字符中间都插入#号,不会改变字符串的性质,但使得每个回文串都变成奇数个字符的长度
    • 为了处理下标越界的问题,可以在字符串开头加上^,结尾加上$,两个特殊字符,使得循环在碰到这两个符号的时候退出
    • ……