最長迴文子串--演算法思想探討和實現(python java)
阿新 • • 發佈:2018-11-10
最長迴文子串–演算法思想探討和實現(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;
}
}