您的位置:首页 > 其它

LeetCode---5. Longest Palindromic Substring(最长回文子串)

2016-09-14 21:27 597 查看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.

Subscribe to see which companies asked this question

public class Solution{
public  String longestPalindrome(String s) {
if (s.isEmpty()) {
return null;
}

if (s.length() == 1) {
return s;
}

String longest = s.substring(0, 1);
for (int i = 0; i < s.length(); i++) {
// get longest palindrome with center of i
String tmp = helper(s, i, i);
if (tmp.length() > longest.length()) {
longest = tmp;
}

// get longest palindrome with center of i, i+1
tmp = helper(s, i, i + 1);
if (tmp.length() > longest.length()) {
longest = tmp;
}
}

return longest;
}
public String helper(String s, int begin, int end) {
<span style="white-space:pre">	</span>while (begin >= 0 && end <= s.length() - 1 && s.charAt(begin) == s.charAt(end)) {
<span style="white-space:pre">		</span>begin--;
<span style="white-space:pre">		</span>end++;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return s.substring(begin + 1, end);
}

Manacher算法:

时间超时:

public class Solution {
public String longestPalindrome(String s) {
int id=1;//回文中心,
int[] r;//记录以i为中心的最大半径
int mx=1;//记录最大回文边界
String ss="$#";
//1.奇偶性处理
for(int i=0;i<s.length();i++){
ss+=s.charAt(i);
ss+="#";
}
//2.
int max=0,ii=0;
r=new int[ss.length()];
for(int i=1;i<ss.length();i++){
if(i<mx){r[i]=Math.min(r[2*id-i], mx-i);}else{r[i]=1;} //算法核心

try{while(ss.charAt(i-r[i])==ss.charAt(i+r[i])){r[i]++;}}
catch(Exception e){}
if(r[i]+i>mx){mx=r[i]+i;id=i;}
if(r[i]>max){max=r[i];ii=i;}

}
//3.找出最大的半径

ss=ss.substring(ii-max+1, ii+max);
String sss="";
for(int i=0;i<ss.length();i++){
if(ss.charAt(i)!='#'){sss+=ss.charAt(i);}
}
return sss;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: