【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)当&ensp;&ensp;&ensp;前遍历到的子串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;
	}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值