算法筆記_032:最長回文串(Java)


目錄

1 問題描述

2 解決方案

2.1 中心擴展法

2.2 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++){
                if(arrayA[i-j] != arrayA[i+j+1])
                    break;
                tempMax = 2*j + 2;
            }
            if(tempMax > max)
                max = tempMax;
        }
        return max;
    }
    
    public static void main(String[] args){
        StringLongestPalindrome test = new StringLongestPalindrome();
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入一個字符串:");
        String A = in.nextLine();
        int maxA = test.getLongestPalindrome(A);
        System.out.println("輸入目標字符串中最長回文串的長度為:"+maxA);
    }
}

運行結果:

請輸入一個字符串:
abba
輸入目標字符串中最長回文串的長度為:4


請輸入一個字符串:
aabbbbba
輸入目標字符串中最長回文串的長度為:7


請輸入一個字符串:
我愛愛我我我啊
輸入目標字符串中最長回文串的長度為:4

 

 

 

2.2 Manacher算法

package com.liuzhen.practice;

import java.util.Scanner;

public class Main {
    
    public void Manacher(String A) {
        StringBuffer s = new StringBuffer("$#");
        for(int i = 0;i < A.length();i++) {
            s.append(A.charAt(i));
            s.append("#");
        }
        A = s.toString();
        int[] P = new int[A.length()];
        int mx = 0, id = 0;
        for(int i = 1;i < A.length();i++) {
            if(mx > i)
                P[i] = Math.min(P[2 * id - i], mx - i);
            else
                P[i] = 1;
            while(i + P[i] < A.length() && i - P[i] >= 0 && A.charAt(i + P[i]) == A.charAt(i - P[i])) {
                P[i]++;
            }
            if(P[i] + i > mx) {
                mx = i + P[i];
                id = i;
            }
        }
        int result = -1;
        int i = 0, t = 0;
        for(;i < P.length;i++) {
            if(P[i] > result) {
                result = P[i];
                t = i;
            }
        }
        for(int j = t - result + 1;j <= t + result - 1;j++) {
            if(A.charAt(j) != '#')
            System.out.print(A.charAt(j));
        }
        System.out.println("\n最長字符串長度:"+(result-1));
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        Scanner in = new Scanner(System.in);
        String A = in.next();
        test.Manacher(A);
    }
}

 

 

運行結果:

abba
abba
最長字符串長度:4


12212321
12321
最長字符串長度:5


我愛你愛我
我愛你愛我
最長字符串長度:5


我愛她
我
最長字符串長度:1

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM