5. Longest Palindromic Substring 最长回文子序列

本文探讨了在给定字符串中查找最长回文子串的两种方法:一种是最直接但效率较低的逐字符检查法,另一种是试图通过动态规划和最长公共子串(LCS)转换的更高效解决方案,但后者在某些情况下可能失效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

1:

最笨的方法,逐个字符位中心求最长回文子序列,分子序列为奇数和子序列为偶数两种情况,得到最长。

//子序列为奇数 
void jus1(string &s, int n, string &str){
	int i=1,j=1;
    for(; n-i > -1 && n+i < s.size(); ++i ){
    	if(s[n-i] == s[n+i])
    		j+=2;
    	else
    		break;
	}
	if(j>str.size())
		str=s.substr(n - j/2 , j );
}
//子序列为偶数 
void jus2(string &s, int n, string &str){
    int i=0,j=0;
    for( ; n-i>-1 && n+i < s.size(); ++i ){
    	if(s[n-i] == s[n+i+1])
    		j+=2;
    	else 
    		break;
	}
	if(j>str.size())
		str=s.substr(n- j/2 + 1, j );
    
}

string longestPalindrome(string s){
	string res;
	for(int i=0;i<s.size();++i){
		//以s[i]为中心进行搜索 
		jus1(s,i,res);
		jus2(s,i,res);
	}
	return res;
}

2:

以前做过类似的题,有个规律 子序列的题普遍都是用动态规划去做。然后就想通过将序列反转后转化为求最长公共子串(LCS)来求,结果不对,忽略了首尾"aacdefcaa"的情况.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值