[Leetcode 5] Longest Palindromic Substring

本文深入解析了LeetCode第5题“最长回文子串”的两种高效解法,一种是从中心点向两边拓展寻找回文串,另一种是使用动态规划算法。通过详细的算法证明和代码实现,帮助读者理解如何快速找到字符串中的最长回文子串。

[Leetcode 5] Longest Palindromic Substring

1. Description : Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
2. 题意:找出最长回文子串
思路一:取可能的中心点作为回文串中心向两遍拓展,找到最长回文子串(0ms)
证明:若当前需要判断的最长回文串中心为si,且满足si-1≠si=si+1=……=sj≠sj+1,则回文串中心应在si和sj的中心点/中心对。
证明如下(只证si…sj长度为奇数的情况):
  1. 当回文串中心在si和sj的中心点s(i+j)/2,最长回文串长度至少为j-i+1;
  2. 单中心点情况:若在其他位置,假设为sk且i≤k<(i+j)/2,则i+1≤2k-i+1<j+1,则s2*k-i+1=sk≠si-1,此时最长回文串长度为2(k-i)+1<j-i+1;同理(i+j)/2<k≤j的情况下最长回文串长度为2*(j-k)+1<j-i+1;
  3. 双中心点情况(j-i+1>1):假设为sk,sk+1且i≤k≤(i+j)/2-1, i+2≤2k-i+2≤j,则s2*k-i+2=sk≠si-1,最长回文串长度为2k-2i+2≤j-i<j-i+1;同理(i+j)/2≤k≤j-1的情况下最长回文串长度为2(j-k)≤j-i<j-i+1;
  4. 综上所述,当最长回文串中心必不在除si和sj的中心点s(i+j)/2之外的点上,si…sj长度为偶数的情况同理。
解法:根据上述证明,我们只需检查形如 si-1≠si=si+1=……=sj≠sj+1 的中心点s(i+j)/2(j-i+1为奇数)或(s(i+j-1)/2,s(i+j+1)/2)(j-i+1为偶数)的最长回文子串的长度,并记录即得到答案。
class Solution {
public:
    string longestPalindrome(string &s) {
        if(s.size() < 2) return s;
		int max_left = 0, max_len = 1;
		int l, r, start = 0, len = s.size();
		while(start < len){
			l = r = start;
			while(r < len - 1 && s[r+1] == s[r]) r++;
			start = r + 1;
			while(l > 0 && r < len - 1 && s[l-1] == s[r+1]){
				l--;
				r++;
			}
			if(r - l + 1 > max_len){
				max_left = l;
				max_len = r - l + 1;
			}
		}
		return s.substr(max_left, max_len);
    }
};
思路二: DP(4ms)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值