这里写的是普通解法,算法时间复杂度为O(n^2)
- 这里我仅仅是为了督促自己每天刷一道算法题,并不是为了写出每道题的最优解,在此之前,我仅仅是将Leetcode基础题刷了一遍。
- 首先抛出思路,长为n的字符串共有n^2个子串,而判断一个回文串的方法是设立头尾指针,从两边向中间夹,这样的到的便是暴力求解,其时间复杂度为O(n ^3),这里我并没有给出代码。
- 对上面的思路进行优化,可优化的地方在于,如果子串a[i:j]已经不是回文串,那么a[i-1:j+1]也一定不是回文串,所以,我们从字符串开头进行遍历,找出以该字符为中心的最长回文串即可,这里又要分解成两种情况,如:abcddcba,和abcdcba,均为回文串,但是其中心,一个为d,一个为dd,分解的情况即为奇偶两种,下面贴出代码
- 这里提醒大家一定要注意边界问题,处理边界花了我好久。。。还是我太渣了,加油!
public class Test05 {
public static void main(String[] args) {
System.out.println(longestPalindrome("aba"));
}
public static String longestPalindrome(String s) {
if(s==null||s.length()==0) {
return "";
}else if(s.length()==1) {
return s;
}
char[] str = s.toCharArray();
int front1 = 0,front2 = 0,rear1 = 0,rear2 = 0;
String result = "";
for(int i = 0;i<str.length-1;i++) {
front1=i;rear1=i;
for(;front1>=0&&rear1<=str.length-1&&str[front1]==str[rear1];--front1,++rear1) ;
++front1;
--rear1;
front2=i;rear2=i+1;
if(str[front2]!=str[rear2]) {
rear2 = front2;
}else {
for(;front2>=0&&rear2<=str.length-1&&str[front2]==str[rear2];--front2,++rear2) ;
++front2;
--rear2;
}
if(rear1-front1+1>result.length()) {
result = s.substring(front1, rear1+1);
}
if(rear2-front2+1>result.length()) {
result = s.substring(front2, rear2+1);
}
}
return result;
}
}