1. 程式人生 > >最長迴文子串--演算法思想探討和實現(python java)

最長迴文子串--演算法思想探討和實現(python java)

最長迴文子串–演算法思想探討和實現(python java)

迴文串定義:
    如果一個字串正著讀和反著讀是一樣的,那它就是迴文串。

下面是一些迴文串的例項:

 12321 
 a
 aba 
 abba
 aaaa 
 tattarrattat

問題定義

最長迴文子串問題:給定一個字串,求它的最長迴文子串。

解題思路:

演算法的解題思路來源於這位播主的講解,寫的很棒,這裡我就直接引用了(在次感謝這位大佬)

程式碼實現:

python實現

import math
def LongestPalindromeSubstring(str):
str_padding=["#"] for char in str: str_padding.append(char) str_padding.append("#") # print("".join(str_padding)) pos=0 maxRight=0 len_Max=0 pos_Max=0 len_str_padding=len(str_padding) rl=[0]*len_str_padding # print(len(rl)) for i in range(len_str_padding): if
i<maxRight: j=2*pos-i rl[i]=min(rl[j],maxRight-i) else: rl[i]=1 while i-rl[i]>=0 and i+rl[i]<len_str_padding and str_padding[i-rl[i]]==str_padding[i+rl[i]]: rl[i]+=1 if i+rl[i]-1>maxRight: pos=i maxRight=i+rl[i]-1
if len_Max<rl[i]: len_Max=rl[i] pos_Max=i return "".join(str_padding[pos_Max-len_Max+1:pos_Max+len_Max-1]).replace("#","") if __name__=='__main__': str=input("請輸入你要檢測的字串:") print(LongestPalindromeSubstring(str))

java實現

package com.xhm.blog;

import java.util.Scanner;

public class LongestPalindromeSubstring {
    public static void main(String[] args) {
        String str1=null;
        Scanner scanner=new Scanner(System.in);
        if(scanner.hasNextLine()){
            str1 = scanner.nextLine();

        }
        System.out.println(LongestPalindromeSubstring.LPS_subString_1(str1));
        scanner.close();

    }

    public static String LPS_subString_1(String str){
//        System.out.println(str);
        int len_str=str.length();
        String[] str_padding=new String[2*len_str+1];
        for(int i=0;i<2*len_str+1;i++){
            if(i%2==0)
                str_padding[i]="#";//填充的符號
            else
                str_padding[i]=String.valueOf(str.charAt((i-1)/2));

        }
//        System.out.println(str_padding.toString());

        int rl[] =new int[2*len_str+1];//注意java裡面 int 預設值全是0
        int pos=0,maxRinght=0;
        int pos_Max=0,len_Max=0;
        for(int i=0;i<2*len_str+1;i++){
            int j=2*pos-i;
            if(i<maxRinght){
                rl[i]=Math.min(rl[j],maxRinght-i);//站在j的角度去理解
            }
            else
                rl[i]=1;
            //在上述所能確定的最小的rl上繼續擴充套件
            while (i-rl[i]>=0 && i+rl[i]<2*len_str+1 && (str_padding[i-rl[i]].equals(str_padding[i+rl[i]]))){
                rl[i]++;
            }

            if (i+rl[i]-1>maxRinght){
                maxRinght = i+rl[i]-1;
                pos=i;
            }
            if(rl[i]>len_Max){
                len_Max=rl[i];
                pos_Max=i;
            }

        }

        String res="";
        for(int i=pos_Max-len_Max+1;i<=pos_Max+len_Max-1;i++){
            res+=str_padding[i];
        }
        String res_1=res.replace("#","");
//        System.out.println(res_1);
        return res_1;
    }

}