标签:对比 return append pen 避免 开始 max 字符串 半径
给定一个字符串 s
,找到 s
中最长的回文子串。
public static String longestPalindrome(String s) { //最大长度 int max=0; //最大长度的回文中心 int mi=0; //加#避免漏虚轴 char[] chars = addf(s); //对应chars上当前字符回文半径 int[] pr=new int[chars.length]; //当前最右能扩到的位置 int r=0; //当前扩到最右位置的中心点 int ri=0; for (int i = 0; i < chars.length; i++) { //从当前右边第几个开始扩 int k=1; if (ri*2-i>=0&&r>=pr[ri*2-i]+i){ k=pr[ri*2-i]; } //对比回文串 while ((i+k)<chars.length && i-k>=0){ if (chars[i+k]==chars[i-k]){ k++; }else { break; } } //更新最右值 if (k+i-1>r){ r=k+i-1; ri=i; } //记录当前位置半径 pr[i]=k-1; //更新最大值 int length=k*2-1; if (length>max){ max=length; mi=i; } } //组织回文串 StringBuilder re=new StringBuilder(); int index=mi-(max-1)/2; for (int i = 0; i < max; i++) { if (chars[index]==‘#‘){ index++; continue; } re.append(chars[index]); index++; } return re.toString(); } public static char[] addf(String s){ char[] chars=new char[s.length()*2+1]; for (int i = 0; i < s.length(); i++) { chars[2*i]=‘#‘; chars[2*i+1]=s.charAt(i); } chars[s.length()*2]=‘#‘; return chars; }
标签:对比 return append pen 避免 开始 max 字符串 半径
原文地址:https://www.cnblogs.com/macbk/p/13596382.html