【LeetCode刷题】最长回文子串Longest Palindromic Substring(java)

题目:

Given a string, find the length of the longest substring without repeating characters. Examples: Given “abcabcbb”, the answer is “abc”, which the length is 3. Given “bbbbb”, the answer is “b”, with the length of 1. Given “pwwkew”, the answer is “wke”, with the length of 3. Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

   1、首先是用动态规划的思想,使用一个二维矩阵来记录当前遍历到的子串是不是回文子串。我理解的动态规划思想主要是让当前的元素与其上一个元素建立某种关系。在这道题中,该二维矩阵就是当前元素与其上一个元素的关系。

package leetcode;

public class LongestPalindromicSubstring {

	public static void main(String[] args) {
		String s = "aaaa";
		String solu = longestPalindrome(s);
		System.out.println(solu);

	}
	public static String longestPalindrome(String s) {
       // String solu = null;
        int len = s.length();
        int maxLen = 0;
        String res = null;
        
        boolean[][] dp = new boolean[len][len];
        for(int i = len - 1;i >= 0;i--){
        	for(int j = i;j < len;j++){
        		dp[i][j] = s.charAt(i) == s.charAt(j) && (j - i < 3 || dp[i+1][j-1] == true);//(1)当   前遍历到的子串i~j是否是回文子串取决于i+1~j-1,也就是i~j中间的子串是否是回文并且s[i]是否等于s[j];(2)dp[i][j]是为true则意味着i~j是回文子串,则在下面判断后对res进行更新;如果为false,则该子串不是回文子串,开始遍历下一个子串。
        		
        		if(dp[i][j] == true && (res == null || j - i + 1 > maxLen)){//如果该子串长度更长,则更新res
        			res = s.substring(i, j+1);
        			maxLen = res.length();
        		}
        	}
        }
        return res;
	}
}

   2、还看到一个复杂度更低的解法

class Solution {
   private int lo, maxLen;

public String longestPalindrome(String s) {
	int len = s.length();
	if (len < 2)
		return s;
	
    for (int i = 0; i < len-1; i++) {
    //遍历整个数组,寻找回文子串最中间的字符,如果回文子串是奇数长度,那么最中间有一个字符;否则有两个字符
     	extendPalindrome(s, i, i);  //extendPalindrome方法就是以遍历到的当前字符为中心向左右两边扩展
     	extendPalindrome(s, i, i+1); //assume even length.
    }
    return s.substring(lo, lo + maxLen);
}

private void extendPalindrome(String s, int j, int k) {
	while (j >= 0 && k < s.length() && s.charAt(j) == s.charAt(k)) {
		j--;//如果满足括号里的条件,则继续向两边扩展
		k++;
	}
	if (maxLen < k - j - 1) {//更新最大长度的值
		lo = j + 1;
		maxLen = k - j - 1;
	}
}
}

你可能感兴趣的:(java的漫长学习之路)