求最长回文子串(Manacher)算法
2018-03-30 10:35
141 查看
package test; //Manacher算法,马拉车算法求最长回文子串 //算法基本要点:首先用一个非常巧妙的方式,将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度: //在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 //为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a#。 //然后用一个数组 P[i] 来记录以字符S[i]为中心的最长回文子串向左/右扩张的长度(包括S[i]), //P[i]-1正好是原字符串中回文串的总长度 //计算P[i],该算法增加两个辅助变量id和mx,其中id表示最大回文子串中心的位置,mx则为id+P[id],也就是最大回文子串的边界。 //这个算法的关键点就在这里了:如果mx > i,那么P[i] >= MIN(P[2 * id - i], mx - i)。 public class Main { //预处理 static void perProcess(String str,char[]strArry){ strArry[0]='$'; strArry[strArry.length-1] = '@'; for(int i =0;i<str.length();i++){ strArry[i*2+1] = '#'; strArry[i*2+2] = str.charAt(i); } strArry[str.length()*2+1] = '#'; System.out.println(strArry); } //马拉车算法 static void Manacher(char[] strArry,int[] p,String str){ int id=0,mx=0;//id是最长回文子串的中心,mx是id+p[id],即最长回文子串的右边界。 for(int i = 1;i<strArry.length-1;i++){ //求p[i] if(mx>i){ p[i] = Math.min(mx-1, p[2*id-i]); }else { p[i] = 1; } while (strArry[i+p[i]]==strArry[i-p[i]]) { ++p[i]; } if(mx<i+p[i]){ mx = i+p[i]; id=i; } } int length=0,center=0; for(int i = 0;i<p.length;i++){ if(length<p[i]){ length=p[i]; center=i; } } System.out.println(center+""+length); System.out.println(str.substring((center-length)/2, (center+length-1)/2)); } public static void main(String[] args) { String str="19234543278"; int[] p = new int[str.length()*2+3]; char[] strArry = new char[str.length()*2+3]; perProcess(str,strArry); Manacher(strArry, p, str); } }参考文章: https://www.zhihu.com/question/40965749/answer/152396279 http://www.cnblogs.com/biyeymyhjob/archive/2012/10/04/2711527.html
相关文章推荐
- [51Nod1089] 最长回文子串 V2(Manacher算法)
- 寻找最长回文子串(Palindromic Substring)的一种简单的Java解法
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 5. 最长回文子串
- python实现对求解最长回文子串的动态规划算法
- O(n)时间求字符串的最长回文子串
- 最长回文子串:Manacher算法[转]
- Leetcode#5. Longest Palindromic Substring(最长回文子串:二种解法)
- 最长回文子串---Manacher算法
- 最长回文子串
- 最长的回文子串
- O(n) 求 最长回文子串
- 题目1 : 最长回文子串
- 最长回文子串
- Manarcher 求 字符串 的最长回文子串 【记录】
- 求最长回文子串 - leetcode 5. Longest Palindromic Substring
- hihoCoder-1032 - 最长回文子串(Manacher 马拉车)
- 最长回文子串
- 求 最长不重复子串的长度 & 最长回文的长度
- URAL - 1297 Palindrome(后缀数组求最长回文子串)