Leetcode---最长回文子串--普通解

这里写的是普通解法,算法时间复杂度为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++) {
			/**
			 * 此处注意处理front 和 rear 越界
			 */
			//奇数,以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()) {
//				System.out.print(i+","+front1+","+rear1);
//				System.out.println();
				result = s.substring(front1, rear1+1);
			}
			if(rear2-front2+1>result.length()) {
				result = s.substring(front2, rear2+1);
			}
		}
		//第三种方法O(n),有点难
		return result;
    }
}

Leetcode---最长回文子串--普通解_第1张图片

你可能感兴趣的:(算法,Java,Leetcode,算法)