您的当前位置:首页正文

leetcode-5 最长回文子串

2024-11-13 来源:个人技术集锦

坚持打卡!


题目:

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

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


主要思路:

1,这里我是参考帖子上面的大神的代码,进行一个逻辑的学习

2,采用中心扩展算法的方法,即:aba,来说,回文中心的两侧都是一样对应的。所以我们可以从它的中心展开,进行两侧的对比。对比的次数为:2n−1 次。

怎么得出?

回文有两种情况:

第一种,aba 类型。此时a为中心,可以作为中心的点有 n 个

第二种,abba类型。此时bb为中心,可以作为中心的点有n - 1 个

所以加起来就是 2n -1 。

3,接下来就是对两种情况进行统计,得出最大的回文子串长度,并记录中心的下标。再得到该回文子串的起始末尾的下标,对它进行输出


参考代码

/**
 *
 * @author SanYi
 * @version leetcode-5 最长回文子串
 *
 */
public class Test5 {

	public static void main(String[] args) {
		// 测试数据
		String s = "cbAbccbAbergswegaqfcsd";
		System.out.println(longestPalindrome(s));
	}

	/**
	 * 获取字符串最长的回文子串
	 * */
	public static String longestPalindrome(String s) {
		// 判断传进来的参数是否符合要求
		if (s == null || s.length() < 1)
			return "";
		int start = 0, end = 0;
		// 循环
		for (int i = 0; i < s.length(); i++) {
			// 判断在一个字符为中心时候的回文长度
			int len1 = getLongString(s, i, i);
			// 判断在两个字符为中心时候的回文长度
			int len2 = getLongString(s, i, i + 1);
			// 取记录最长
			int len = Math.max(len1, len2);
			// 获取最长回文子串的起始下标
			if (len > end - start) {
				start = i - (len - 1) / 2;
				end = i + len / 2;
			}
		}
		// 返回截取的回文子串
		return s.substring(start, end + 1);
	}

	/**
	 * @param s
	 *            字符串
	 * @param left
	 *            左边下标
	 * @param right
	 *            右边下标
	 * */
	private static int getLongString(String s, int left, int right) {
		int L = left, R = right;
		// 计算最长的范围
		while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
			L--;
			R++;
		}
		// 返回长度
		return R - L - 1;
	}
}

总结:

在解决的过程中,看到评论下放各种大佬给出的解答。让我深受感触,感受到各种思维在跳动,一件事情的实现绝非只有一种方式,而每一种方式都是可以不断完善的。学无止境!

显示全文