leetcode 字符串_5最长回文子串

leetcode 字符串_5最长回文子串

  • 暴力求解
    (1)求出所有子串
    (2)单独判断每个字串是不是回文子串
/**
	 * desc:暴力求解,1.求出所有子串,2.子串是不是回文串
	 * 
	 * @param s
	 * @return
	 */
	public static String longestPalindrome(String s) {
		if (s == null || s.isEmpty()) {
			return "";
		}
		// 最终的子串
		String res = "";
		// 字串长度
		int max = 0;
		for (int i = 0; i < s.length(); i++) {
			for (int j = i + 1; j <= s.length(); j++) {
				String substring = s.substring(i, j);
				// 最长字串max<当前子串长度时,才有必要重新指定最大子串
				if (isPalindrome(substring) && max < substring.length()) {
					res = substring;
					max = Math.max(max, substring.length());
				}

			}
		}
		return res;
	}

	/**
	 * desc: 判断是否为回文数
	 * 
	 * @param s 字符串
	 * @return 是否是回文数:true=回文数,false=不是回文数
	 */
	public static boolean isPalindrome(String s) {
		String reverse = new StringBuilder(s).reverse().toString();
		if (reverse.equals(s)) {
			return true;
		}
		return false;
	}
  • 中心扩散法
 // 中心扩散法

public String longestPalindrome(String s) {
    int len = s.length();
    if (len < 2) {
        return s;
    }
    int maxLen = 1;
    int start = 0;
    // 中心位置枚举到 len - 2 即可
    for (int i = 0; i < len - 1; i++) {
        int oddLen = expandAroundCenter(s, i, i);
        // System.out.println("oddLen:" + oddLen);
        int evenLen = expandAroundCenter(s, i, i + 1);
        // System.out.println("evenLen:" + evenLen);

        int curMaxLen = Math.max(oddLen, evenLen);
        if (curMaxLen > maxLen) {
            maxLen = curMaxLen;
            start = i - (maxLen - 1) / 2;
        }
    }
    return s.substring(start, start + maxLen);
}

/**
 * 回文串的长度
 * @param s
 * @param left
 * @param right
 * @return
 */
private int expandAroundCenter(String s, int left, int right) {
    // left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数
    // right = left + 1 的时候,此时回文中心两个字符,回文串的长度是偶数
    int len = s.length();
    int i = left;
    int j = right;
    while (i >= 0 && j < len) {
        if (s.charAt(i) == s.charAt(j)) {
            i--;
            j++;
        } else {
            break;
        }
    }
    // 这里要小心,跳出 while 循环时,恰好满足 s.charAt(i) != s.charAt(j),
    // 此时回文串的长度是 j - i
    return j - i - 1;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值