【编程题】LeetCode.0005 最长回文子串

题目描述:
给你一个字符串 s,找到 s 中最长的回文子串。

示例:
示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”
示例 3:

输入:s = “a”
输出:“a”
示例 4:

输入:s = “ac”
输出:“a”

解析:
这题从直观观感来看,似乎跟之前一题求区间最大值类似,似乎可以用滑动窗口可解,当然这可行,不过效率不高。
分析回文定义,如果一个字符串s[l][r]是回文字符串,则它的子字符串s[l+1][r-1]也应该是回文字符串。因此理所当然可以靠动态规划实现。

class solution
{
public:
	string longestPalindrome(string s) 
	{
		//空字符串或字符串长度为1
		if(s.length()<2)
		{
			return s;
		}

		int length = s.length(); //字符串长度
		int max_length = 1;			 //最大长度
		int start = 0;			 //子字符串开始位置

		//标记子字符串是否为回文
		int flag[1005][1005] = { 0 };

		for(int r=1;r<length;r++)
		{
			for(int l=0;l<r;l++)
			{
				//两字符需相同
				//单字符或aa类型字符串
				//前序子字符串也为回文
				if(s[l]==s[r]&&(r-l<=2||flag[l+1][r-1]))
				{
					flag[l][r] = 1;
					//新回文长度
					int new_length = r - l + 1;
					if(new_length>max_length)
					{
						max_length = new_length;
						start = l;
					}
				}
			}
		}

		return s.substr(start, max_length);
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值