20200118:(leetcode)最长回文子串(中心扩展算法详解及思考)

最长回文子串(中心扩展算法详解及思考)

题目

  1. 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

中心扩展算法详解

  • 这代码很好理解,主要是卡了我很久的地方为这个索引的计算,仔细推敲之下才搞清楚关于这些索引的细节点:在代码里我已经具体注释出来。
  • 最关键的问题不仅限于本文,很多时候都是这样卡住思路一卡一整天,所以必须总结思考,关于这类的索引下标问题,必须要逐个推敲,才能写出自己思路的完整代码,最好举例子让自己理解,不懂的代码要先敲一下,再理解,再自己重新写,这样才能吃透,思路必须清晰,唉,晚安自己

代码实现

  1. 详细的索引推敲见代码注释
package com.immunize.leetcode.longestPalindrome;

/**
 * 2.暴力法优化
 * 
 * @author Mr IMMUNIZE
 *
 */

public class Solution2 {
	public String longestPalindrome(String s) {
		if (s == null || s.length() < 1)
			return "";
		int start = 0, end = 0;
		for (int i = 0; i < s.length(); i++) {
			// 字符串的长度为奇数时,从同一字符出发进行中心扩展
			String str1 = Excenter(s, i, i);
			// 字符串的长度为奇数时,从该字符和其后相邻字符出发进行中心扩展
			String str2 = Excenter(s, i, i + 1);
			// 获取两种比较之下的最长回文字符串的长度
			int len = Math.max(str1.length(), str2.length());
			// 更新长度信息
			if (len > end - start) {
				// 当前起始索引要往前退 的值和当前结束索引往后退的值: 分开算,
				// 奇数的话,(当前长度-1)/2 或 当前长度/2
				// 偶数的话,(当前长度-1)/2
				// 统一起始点索引为 当前索引 - (当前长度-1)/2
				// 当前结束索引往后退的值: 分开算,
				// 奇数: 当前长度/2 或 (当前长度-1)/2
				// 偶数:当前长度/2
				// 统一结束点索引:当前索引 + 当前长度/2
				start = i - (len - 1) / 2;
				end = i + len / 2;
			}
		}
		// 截取start-end闭区间的所有字符
		return s.substring(start, end + 1);
	}

	private String Excenter(String s, int left, int right) {
		while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
			left--;
			right++;
		}
		return s.substring(left + 1, right);
	}
}

  1. 效率明显提升了很多

在这里插入图片描述
3. 马拉车算法真的看不懂,我先睡了,明天再看,这题能卡我一周

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
根据提供的引用内容,有三种方法可以解决LeetCode上的最长回文子串问题。 方法一是使用扩展中心法优化,即从左向右遍历字符串,找到连续相同字符组成的子串作为扩展中心,然后从该中心向左右扩展,找到最长的回文子串。这个方法的时间复杂度为O(n²)。\[1\] 方法二是直接循环字符串,判断子串是否是回文子串,然后得到最长回文子串。这个方法的时间复杂度为O(n³),效率较低。\[2\] 方法三是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的。这个方法的时间复杂度也为O(n³),效率较低。\[3\] 综上所述,方法一是解决LeetCode最长回文子串问题的最优解法。 #### 引用[.reference_title] - *1* [LeetCode_5_最长回文子串](https://blog.csdn.net/qq_38975553/article/details/109222153)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Leetcode-最长回文子串](https://blog.csdn.net/duffon_ze/article/details/86691293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LeetCode 第5题:最长回文子串Python3解法)](https://blog.csdn.net/weixin_43490422/article/details/126479629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值