leetcode 5. 最长回文子串

题目

难度:中等
在这里插入图片描述

思路

可以看出,回文子串去掉前后单词后,仍然是回文子串。
所以采用动态规划
初始状态:1个单词时,是回文子串;2个单词时,若单词相等,就是回文子串,否则不是;
递推公式:当满足 s[i]==s[j] 且 s[i+1 ~ j-1]是回文子串时,子串 s[i~j] 为回文子串,否则不是。

C++代码

class Solution {
public:
	string longestPalindrome(string s) {
		int n = s.size();
		vector<vector<int>>v(n, vector<int>(n));//新建 全0 二维数组
		string res;
		for (int len = 0; len < n; len++) {//子串长度-1
			for (int i = 0; i + len < n; i++) {
				int j = i + len;
				if (len == 0) v[i][j] = 1;//子串长度为1时,肯定是回文
				else if (len == 1) v[i][j] = (s[i] == s[j]);//长度为2时,两个相等即是回文
				else { //长度>2时,看 前后字符是否相等 && 中间子串是否回文
					v[i][j] = (s[i] == s[j] && v[i + 1][j - 1]);
				}
				if (v[i][j] && len + 1 > res.size()) //i到j是回文,且长度大于 旧回文子串
					res = s.substr(i, len+1);
			}
		}
		return res;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值