Java实现最长回文串

Java实现最长回文串算法
本文介绍了如何使用Java解决找到一个字符串中最长回文子串的问题。详细讲解了中心扩展法和Manacher算法,通过这两种方法实现了找到最长回文串,并给出了运行结果。

1 问题描述
给定一个字符串,求它的最长回文子串的长度。

2 解决方案
2.1 中心扩展法

此处,首先枚举出回文串的中心位置,然后,再在该位置上分别向左和向右扩展,记录并更新得到的最长回文串的长度。

package com.liuzhen.string_1;

import java.util.Scanner;

public class StringLongestPalindrome {
    /*
     * 参数A:给定字符串
     * 函数功能:返回字符串A中最长回文串的长度
     */
    public int getLongestPalindrome(String A){
        char[] arrayA = A.toCharArray();
        int max = 0;
        int tempMax = 0;
        if(A.equals("") || A.equals(null))
            return 0;
        for(int i = 0;i < arrayA.length;i++){  //i为回文串的中心位置
            //当回文串位数为奇数时
            for(int j = 0;(i-j) >= 0 && (i+j) < arrayA.length;j++){
                if(arrayA[i-j] != arrayA[i+j])
                    break;
                tempMax = 2*j + 1;
            }
            if(tempMax > max)
                max = tempMax;
            //当回文串位数为偶数时
            for(int j = 0;(i-j) >= 0 && (i+j+1) < arrayA.length;j++){
     
以下是几种使用 Java 语言实现最长回文子串的方法及代码: ### 暴力枚举法 思路是枚举所有可能的子串,然后判断每个子串是否是回文串,最后最长回文子串。 ```java public class LongestPalindrome { public static String longestPalindrome(String s) { int n = s.length(); String longest = ""; for (int i = 0; i < n; i++) { for (int j = i + 1; j <= n; j++) { String sub = s.substring(i, j); if (isPalindrome(sub) && sub.length() > longest.length()) { longest = sub; } } } return longest; } public static boolean isPalindrome(String s) { int left = 0, right = s.length() - 1; while (left < right) { if (s.charAt(left) != s.charAt(right)) { return false; } left++; right--; } return true; } public static void main(String[] args) { String s = "babad"; System.out.println(longestPalindrome(s)); } } ``` ### 动态规划法 使用动态规划的思想,创建一个二维数组 `dp`,其中 `dp[i][j]` 表示从索引 `i` 到索引 `j` 的子串是否为回文串。通过遍历所有长度的子串,从最短的子串起,依次判断是否为回文串,并根据判断结果更新最长回文子串。 ```java class Solution { public String longestPalindrome(String s) { if (s == null || s.length() == 0) { return s; } int len = s.length(); //记录最长回文串的下标 int left = 0, right = 0; //初始化dp数组 boolean[][] dp = new boolean[len][len]; //保证 i 降序,j 升序 for (int i = len - 1; i >= 0; i--) { for (int j = i; j < len; j++) { //当i和j对应的字符相等时,开始进行情况判断 if (s.charAt(i) == s.charAt(j)) { //情况1:下标i和下标j相同,表示同一个字符如a //情况2:下标i和下标j相差1,例如aa,也是回文子串 if (j - i <= 1) { dp[i][j] = true; } else if (dp[i + 1][j - 1]) { //情况3:下标相差大于1,根据dp[i+1][j-1]进行判断 dp[i][j] = true; } } //更新最长回文串的下标 if (dp[i][j] && j - i > right - left) { right = j; left = i; } } } return s.substring(left, right + 1); } } ``` ### 中心扩展法 思路是遍历字符串,以每个字符或相邻两个字符为中心,向两边扩展来寻回文子串。 ```java class Solution { public String longestPalindrome(String s) { if (s == null || s.length() < 1) { return ""; } int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); int len2 = expandAroundCenter(s, i, i + 1); int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } private int expandAroundCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } return right - left - 1; } } ```
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值