Manacher's Algorithm马拉车算法

用于解决最长回文子串长度的问题

 // 统一奇偶回文子串
    public char[] manacherString(String s) {
        int n = s.length();
        char[] newChar = new char[2 * n + 1];
        int index = 0;
        for (int i = 0; i < newChar.length; i++) {
            newChar[i] = (i & 1) == 0 ? '#' : s.charAt(index++);
        }
        return newChar;
    }

    public  int maxLcpsLength(String s) {
        char[] newChar = manacherString(s);
        int[] pArr = new int[newChar.length];
        // 回文中心和最右回文边界
        int index = -1, pR = -1;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < newChar.length; i++) {
            // 先得到位置i的回文半径的下限
            pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1;
            // 然后通过向两边扩的形式看i最多能扩到哪里
            while (i + pArr[i] < newChar.length && i - pArr[i] > -1) {
                if (newChar[i + pArr[i]] == newChar[i - pArr[i]]) {
                    pArr[i]++;
                } else {
                    break;
                }
            }
            // 及时更新回文中心和最右回文边界
            if (i + pArr[i] > pR) {
                pR = i + pArr[i];
                index = i;
            }
            max = Math.max(max, pArr[i]);
        }
        return max - 1;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容