首页
/ Java算法库中的Manacher算法:线性时间查找最长回文子串

Java算法库中的Manacher算法:线性时间查找最长回文子串

2025-05-01 01:15:24作者:尤峻淳Whitney

Manacher算法是一种高效解决最长回文子串问题的经典算法,其时间复杂度仅为O(n)。该算法由计算机科学家Glenn Manacher于1975年提出,相比传统的中心扩展法(O(n²))具有显著优势。

算法核心思想

Manacher算法的精妙之处在于通过预处理和动态规划思想避免了重复计算:

  1. 字符串预处理:在原字符串每个字符间插入特殊分隔符(如#),将奇偶长度回文统一转换为奇长度处理。例如"abba"预处理后变为"^#a#b#b#a#"(添加^符号处理边界条件)

  2. 回文半径数组P[]:记录以每个字符为中心的最长回文半径值,这是算法的核心数据结构

  3. 中心扩展优化:利用已计算的回文信息,通过镜像原理减少不必要的扩展操作

实现步骤详解

public class ManacherAlgorithm {
    
    public static String longestPalindrome(String s) {
        if (s == null || s.length() == 0) return "";
        
        // 预处理字符串
        char[] T = preProcess(s);
        int n = T.length;
        int[] P = new int[n];
        int C = 0, R = 0;
        
        for (int i = 1; i < n-1; i++) {
            // 利用镜像性质快速初始化P[i]
            int mirror = 2*C - i;
            if (i < R) {
                P[i] = Math.min(R - i, P[mirror]);
            }
            
            // 尝试扩展回文
            while (T[i + (1 + P[i])] == T[i - (1 + P[i])]) {
                P[i]++;
            }
            
            // 更新中心和右边界
            if (i + P[i] > R) {
                C = i;
                R = i + P[i];
            }
        }
        
        // 找出最大回文
        int maxLen = 0;
        int centerIndex = 0;
        for (int i = 1; i < n-1; i++) {
            if (P[i] > maxLen) {
                maxLen = P[i];
                centerIndex = i;
            }
        }
        
        // 还原原始字符串中的位置
        int start = (centerIndex - maxLen) / 2;
        return s.substring(start, start + maxLen);
    }
    
    private static char[] preProcess(String s) {
        int n = s.length();
        char[] res = new char[2*n + 3];
        res[0] = '^';
        for (int i = 0; i < n; i++) {
            res[2*i + 1] = '#';
            res[2*i + 2] = s.charAt(i);
        }
        res[2*n + 1] = '#';
        res[2*n + 2] = '$';
        return res;
    }
}

算法优势分析

  1. 时间复杂度优化:通过利用已计算的回文信息,避免了重复的中心扩展,将时间复杂度从O(n²)降至O(n)

  2. 空间复杂度:仅需要O(n)的额外空间存储回文半径数组

  3. 统一处理:通过预处理巧妙解决了奇偶长度回文的差异问题

实际应用场景

Manacher算法在以下场景中表现优异:

  • DNA序列分析中的回文识别
  • 文本编辑器的拼写检查
  • 数据压缩算法中的重复模式检测
  • 网络安全领域的恶意代码模式识别

算法扩展思考

理解Manacher算法有助于掌握以下高级算法技巧:

  1. 字符串预处理技巧
  2. 动态规划的空间优化
  3. 镜像原理在字符串处理中的应用
  4. 边界条件的特殊处理方式

该算法在Java算法库中的实现展示了如何将理论算法转化为高效、健壮的代码,是学习高级字符串处理算法的优秀范例。

登录后查看全文
热门项目推荐
相关项目推荐