Java实现基于Manacher算法的最长回文子串检测

发布时间:2024-11-11 19:05:43 作者:小樊
来源:亿速云 阅读:78

以下是使用Java实现的基于Manacher算法的最长回文子串检测的示例代码:

public class LongestPalindromicSubstring {
    public static void main(String[] args) {
        String s = "babad";
        System.out.println("The longest palindromic substring is: " + longestPalindrome(s));
    }

    public static String longestPalindrome(String s) {
        if (s == null || s.length() < 1) return "";
        StringBuilder sb = new StringBuilder("#");
        for (int i = 0; i < s.length(); i++) {
            sb.append(s.charAt(i)).append("#");
        }
        String t = sb.toString();
        int[] p = new int[t.length()];
        int maxLen = 0;
        int center = 0;
        int maxRight = 0;
        for (int i = 0; i < t.length(); i++) {
            if (i < maxRight) {
                int j = center - (i - center);
                p[i] = Math.min(maxRight - i, p[j]);
            }
            int left = i - (1 + p[i]);
            int right = i + (1 + p[i]);
            while (left >= 0 && right < t.length() && t.charAt(left) == t.charAt(right)) {
                p[i]++;
                left--;
                right++;
            }
            if (i + p[i] > maxRight) {
                maxRight = i + p[i];
                center = i;
            }
            if (p[i] > maxLen) {
                maxLen = p[i];
            }
        }
        int start = (center - maxLen) / 2;
        return s.substring(start, start + maxLen);
    }
}

代码的主要思路是将原始字符串进行预处理,在每个字符之间插入特殊字符#,以避免奇偶长度回文串的问题。然后,使用一个数组p来记录以每个字符为中心的最长回文子串的半径长度。通过中心扩展法,可以求得每个位置的最长回文子串半径长度,并更新最大长度和中心位置。最后,根据最大长度和中心位置,可以求得最长回文子串的起始位置和长度,进而得到最长回文子串。

推荐阅读:
  1. Java 添加、读取、修改、删除Word文档属性
  2. 一个非科班出生Java程序员的阿里之路:JVM+分布式+Spring+数据库

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Java回文串检测在代码自动生成中的应用

下一篇:Java中如何检测包含混合类型字符的回文数据

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》