您的位置:首页 > 其它

《leetCode》:Longest Palindromic Substring

2016-07-16 21:12 369 查看

题目

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.

思路一:暴力搜索法

暴力搜索法:利用两层for循环来判断所有的字符串,找出长度最大的那个是回文的字符子串。

实现代码如下:

public String longestPalindrome(String s) {

if(s==null||s.length()<2){
return s;
}
int len =s.length();

String res = new String();

for(int i=0;i<len;i++){
char ch = s.charAt(i);
for(int j=i+1;j<len;j++){
char ch2 = s.charAt(j);
if(ch==ch2){
String str = s.substring(i, j+1);//
if(isPalindrome(str)){
if(str.length()>res.length()){
res = str;
}
}
}
}
}
return res;
}
//判断一个字符串是否是palindrome
private boolean isPalindrome(String str) {
if(str==null||str.length()<1){
return false;
}
int begin = 0;
int end = str.length()-1;
while(begin<end){
if(str.charAt(begin)!=str.charAt(end)){
return false;
}
begin++;
end--;
}

return true;
}


显然,报超时。

对上面的代码进行改进,内层循环从后面开始遍历,只要找到一个回文,就可以跳出内层循环(后面的即使还存在回文,则肯定比这个长度要短)。

代码如下:

public String longestPalindrome(String s) {

if(s==null||s.length()<2){
return s;
}
int len =s.length();

String res = new String();

for(int i=0;i<len;i++){
char ch = s.charAt(i);
//根据此时的res来限制j的范围
for(int j=len-1;j>=i+res.length();j--){
char ch2 = s.charAt(j);
if(ch==ch2){
String str = s.substring(i, j+1);//
if(isPalindrome(str)){
//如果此时str为回文,则长度一定大于此时的res,因此不需要判断就可以进行更新
res = str;
break;
}
}
}
}
return res;
}
//判断一个字符串是否是palindrome
private boolean isPalindrome(String str) {
if(str==null||str.length()<1){
return false;
}
int begin = 0;
int end = str.length()-1;
while(begin<end){
if(str.charAt(begin)!=str.charAt(end)){
return false;
}
begin++;
end--;
}

return true;
}


很可惜,并没有如我们所愿AC,还是报超时。

思路二:

思路来至于:https://discuss.leetcode.com/topic/23498/very-simple-clean-java-solution

代码如下:

public class LongestPalindrome3 {
int lowIndex = -1;
int maxLen = -1;

public String longestPalindrome(String s) {

if(s==null||s.length()<2){
return s;
}
int len =s.length();

for(int i=0;i<len-1;i++){
//找出以i为中心的最大回文字符串
extendsPalindrome(s,i,i);//assume odd number
extendsPalindrome(s,i,i+1);//assume even number
}
return s.substring(lowIndex, lowIndex+maxLen);
}
private void extendsPalindrome(String s, int i, int j) {
if(s==null||i>j){
return ;
}
while(i>=0&&i<=j&&j<s.length()&&s.charAt(i)==s.charAt(j)){
i--;
j++;
}
int len = (j-1)-(i+1)+1;
if(maxLen<len){
lowIndex = i+1;
maxLen = len;
}
}
public static void main(String[] args){
String str = "111";
String res = new LongestPalindrome3().longestPalindrome(str);
System.out.println(res);

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: