您的位置:首页 > 其它

Leetcode 5 Longest Palindromic Substring

2015-07-24 22:20 316 查看

Longest Palindromic Substring

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.

Solution1

最简单的方法是用暴力去遍历。思路是每次迭代的时候都固定一个i,然后从后面去遍历整个字符串,判断两个指针中间是否为回文串,从后面遍历的好处是:如果找到某一段是回文串,则可以提前退出这次查找,因为剩下的即便有回文串也一定比当前已经找到的要短。但即便如此,这种思路实现在leetcode上对于特定的字符串会报超时错误。代码如下:

public class Solution {
public String longestPalindrome(String s) {
if(s.length()==0) return "";
int start=0,end=0;
for(int i=0;i<s.length();i++){//每次迭代,都先固定i后去遍历j直到找到一个回文串
for(int j=s.length()-1;j>=i;j--){
int k=i,l=j;
for(;k<l;k++,l--) if(s.charAt(k)!=s.charAt(l)) break;//此次循环不是回文串
if(k>=l){//表明是回文串
if(j-i>end-start){
start = i;
end = j;
}
break;//这是此次固定i后能找到的最长的回文串,所以j不用再继续减了
}
}
}
return s.substring(start,end+1);
}
}


Solution2

解法1超时主要在于当字符串的一段全是重复字符的时候,都必须这段重复字符进行遍历尝试,从而浪费了大量时间,比如”baaaaaaaaab”,实际可以转换另一种思路,因为每一段回文串都必定是以其中一个字符为中心点对称的,所以可以根据这个特点来从某一个中心点去往两边扩展,观察该中心点两边是否对称,并且在选择中心点的时候直接跳过那些重复字符。代码如下:

public class Solution {
public String longestPalindrome(String s) {
if(s.length()==0) return "";
int start=0,end=1;
for(int i=0;i<s.length();){
int j=i+1;
for(;j<s.length()&&s.charAt(j)==s.charAt(i);j++);//跳过重复的字符
int m=i-1,n=j;//从重复字符的两端开始判断是否对称
for(;m>=0&&n<s.length()&&s.charAt(m)==s.charAt(n);m--,n++);
if(n-m-1>end-start){
start = m+1;
end = n;
}
i=j;//下一次判断直接跳过重复的字符
}
return s.substring(start,end);//当为空字符串的时候,无法调用substring()方法
}
}


可以看到这种思路的主要特定是以每一个字符为中心点,然后以此往两边扩张到最长。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode