Manacher 算法

来源:互联网 发布:mysql查询分析器 编辑:程序博客网 时间:2024/06/05 03:13

o(n)时间复杂度求最长回文子串的manacher算法:

public class Solution {    public String longestPalindrome(String s) {    if(s.length()==0) return "";    StringBuffer sb=new StringBuffer();    for(int i=0;i<s.length();i++){    sb.append('$').append(s.charAt(i));    if(i==s.length()-1) sb.append('$');    }    int id=0,edge=1;    int idRe=0,maxRe=1;    s=sb.toString();    int[] dp=new int[s.length()];    dp[0]=1;    for(int i=1;i<s.length();i++){    if(i<edge){    dp[i]=Math.min(dp[id*2-i],edge-i);    }else{    dp[i]=1;    }    while(i-dp[i]>=0&&i+dp[i]<s.length()&&s.charAt(i-dp[i])==s.charAt(i+dp[i])){    dp[i]++;    }    if(dp[i]+i>edge){    id=i;    edge=dp[i]+i;    }    if(maxRe<dp[i]){    maxRe=dp[i];    idRe=id;    }    }    StringBuffer re=new StringBuffer();int start=idRe-maxRe+2;for(int i=start;i<=idRe*2-start;i+=2){    re.append(s.charAt(i));    }    return re.toString();    }}




原创粉丝点击