5. 最长回文子串——暴力法---动态规划解法---扩展中心法



暴力法



动态规划解法


class Solution {
    public String longestPalindrome(String s) {
    	if (s == null) return null;
    	char[] cs = s.toCharArray();
    	if (cs.length <= 1) return s;
    	// 最长回文子串的长度(至少是1)
    	int maxLen = 1;
    	// 最长回文子串的开始索引
    	int begin = 0;
    	boolean[][] dp = new boolean[cs.length][cs.length];
    	// 从下到上(i由大到小)
    	for (int i = cs.length - 1; i >= 0; i--) {
    		// 从左到右(j由小到大)
			for (int j = i; j < cs.length; j++) {
				// cs[i, j]的长度
				int len = j - i + 1;
				dp[i][j] = (cs[i] == cs[j]) && (len <= 2 || dp[i + 1][j - 1]);
				if (dp[i][j] && len > maxLen) { // 说明cs[i, j]是回文子串
					maxLen = len;
					begin = i;
				}
			}
		}
    	return new String(cs, begin, maxLen);
    }
}



扩展中心法

  

class Solution {
    public String longestPalindrome(String s) {
    	if (s == null) return null;
    	char[] cs = s.toCharArray();
    	if (cs.length <= 1) return s;
    	// 最长回文子串的长度(至少是1)
    	int maxLen = 1;
    	// 最长回文子串的开始索引
    	int begin = 0;

    	//扫描的范围  [1,cs.length - 2]  从右往左扫 cs.length - 2  --->> 1
    	for (int i = cs.length - 2; i >= 1; i--) {
    		// 以字符为中心向左右扩展
			int len1 = palindromeLength(cs, i - 1, i + 1);
			// 以字符右边的间隙为中心向左右扩展
			int len2 = palindromeLength(cs, i, i + 1);
			len1 = Math.max(len1, len2);
			if (len1 > maxLen) {
				maxLen = len1;
				begin = i - ((maxLen - 1) >> 1);
			}
		}
    	// 以0号字符右边的间隙为中心的最长回文子串长度是2
    	if (cs[0] == cs[1] && maxLen < 2) {
    		// cs[0, 1]就是最长的回文子串
    		begin = 0;
    		maxLen = 2;
    	}
    	return new String(cs, begin, maxLen);
    }
    /**
     * @return 从l开始向左、从r开始向右扫描,获得的最长回文子串的长度
     */
    private int palindromeLength(char[] cs, int l, int r) {
    	while (l >= 0 && r < cs.length && cs[l] == cs[r]) {
    		l--;
    		r++;
    	}
    	return r - l - 1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值