题目
对于这道题目,我决定采用暴力破解的方法,列举所有子串来判断是否是回文,不过我打算从最长的到最小的,这样可以减少列举次数
class Solution {
public String longestPalindrome(String s) {
int length=s.length();
int i=0,j=length;
int maxLength=length;
String temp="";
while(i<j){
temp=s.substring(i,j);
if(isPalindrome(temp)) break;
if(j==length){
i=0;
j=--maxLength;
}else{
i++;
j++;
}
}
return temp;
}
private boolean isPalindrome(String s) {
int i=0;
int j=s.length()-1;
while (i<j){
if (s.charAt(i++)!=s.charAt(j--))return false;
}
return true;
}
}
这里我直接使用了上一篇文章用到的判断回文数的方法
感兴趣的可以看我的上一篇文章 Leetcode初学——回文数
https://blog.csdn.net/qq_39377543/article/details/104010016
言归正传,由于我使用的是暴力法,也就使得效率不高是必然的
所以接下来,讲一个较优的方法
根据回文串的定义,正着和反着读一样,那我们是不是把原来的字符串倒置了,然后找最长的公共子串就可以了。例如 S = "caba" ,S '= "abac",最长公共子串是 "aba",所以原字符串的最长回文串就是 "aba"。
但是呢,在这里我们要注意一点,并不是所有的公共子串都是回文子串,如:S=“abcdba”,S'="abdcba",最长公共子串是“ab”,但是“ab”不是回文,所以我们在设计代码时需要注意这一点,不过对于这种情况,我们只需要再对这个子串的首尾两个字符进行判别就可以避免了。
这里我转载了leetcode上的一位大牛的代码
public String longestPalindrome(String s) {
if (s.equals(""))
return "";
String origin = s;
String reverse = new StringBuffer(s).reverse().toString();
int length = s.length();
int[] arr = new int[length];
int maxLen = 0;
int maxEnd = 0;
for (int i = 0; i < length; i++)
for (int j = length - 1; j >= 0; j--) {
if (origin.charAt(i) == reverse.charAt(j)) {
if (i == 0 || j == 0) {
arr[j] = 1;
} else {
arr[j] = arr[j - 1] + 1;
}
} else {
arr[j] = 0;
}
if (arr[j] > maxLen) {
int beforeRev = length - 1 - j;
if (beforeRev + arr[j] - 1 == i) {
maxLen = arr[j];
maxEnd = i;
}
}
}
return s.substring(maxEnd - maxLen + 1, maxEnd + 1);
}
作者:windliang
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-bao-gu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
运行时间比我的代码高太多了,消耗内存的话,倒是相差不大
这让我越来越明白,学好算法的重要性!
来源:CSDN
作者:Hyporite
链接:https://blog.csdn.net/qq_39377543/article/details/104015104