最长回文子串(Manacher算法)
2017-09-04 23:03
603 查看
给定一个字符串,求它的最长回文子串的长度。
有的博客给出了四种解法
基本思路就请参考其他博客的介绍,在这里主要是分享一个我找了很久的BUG。
BUG:数组越界
找呀找,找到有以下几点原因:
没有对原始字符串增加‘¥’,‘#’,末尾也要加一个‘#’;
在for循环里面,i=1,但是最开始我写成i=0;
for循环与while循环,每次改变 i 与 p[i]的值后,没有进行判断,导致while里的语句出现数组越界问题。
很重要的一点就是注意循环起点,与终点情况;
下面是修改后,增加的两个if 判断,解决数组越界问题。
运行结果:
5
有的博客给出了四种解法
基本思路就请参考其他博客的介绍,在这里主要是分享一个我找了很久的BUG。
BUG:数组越界
找呀找,找到有以下几点原因:
没有对原始字符串增加‘¥’,‘#’,末尾也要加一个‘#’;
在for循环里面,i=1,但是最开始我写成i=0;
for循环与while循环,每次改变 i 与 p[i]的值后,没有进行判断,导致while里的语句出现数组越界问题。
很重要的一点就是注意循环起点,与终点情况;
下面是修改后,增加的两个if 判断,解决数组越界问题。
if(i+p[i]<n){ while(...){ if(i+p[i]>=n){ break; } } }
import java.util.Arrays; /** * Created by user on 2017/9/4. */ public class MyFunction { public static void main(String[] args){ int[] arr={'$','#',1,'#',2,'#',2,'#',1,'#',2,'#',3,'#',2,'#',1,'#'}; int n =arr.length; System.out.println(getMaxHuiwen(arr,n)); } public static int getMaxHuiwen(int[] arr,int n){ int[] p = new int ; int mx = 0; int id =0; for(int i=1 ;i<n-1;i++){ p[i] = (mx>i) ? Math.min(p[2*id-i],mx-i):1; if(i+p[i]<n){ while (arr[i+p[i]]==arr[i-p[i]]){ p[i]++; if(i+p[i]>=n){ break; } } } if(i+p[i]>mx){ mx = i+p[i]; id = i; } } Arrays.sort(p); return p[p.length-1]-1; } }
运行结果:
5
相关文章推荐
- 【Manacher算法】51nod 最长回文子串 V2
- 求最长的回文子串 manacher算法
- 【回文字符串】 最长回文子串O(N) Manacher算法
- 1089 最长回文子串 V2(Manacher算法)
- hdu 3068 最长回文子串 Manacher算法
- poj 3974 Palindrome(最长回文子串,处理大数,Manacher算法)
- 最长回文子串(Manacher算法)
- 最长回文子串(Manacher算法)
- [51Nod1089] 最长回文子串 V2(Manacher算法)
- 最长回文子串 - Manacher算法
- 最长回文子串:Manacher算法
- Manacher算法 O(n) 求最长回文子串
- 最长回文子串--轻松理解Manacher算法
- manacher算法 (O(n)求最长回文子串)
- hdu 3068 最长回文子串 Manacher算法
- 51nod-【1089 最长回文子串 V2(Manacher算法)】
- lintcode最长回文子串(Manacher算法)
- [hiho 01]最长回文子串、Manacher算法
- hiho1032 : 最长回文子串 Manacher算法
- 51nod1089 最长回文子串 V2(Manacher算法)