力扣 最长回文子串 C++ 题解
一、完整题目
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
二、具体思路
- 利用动态规划的思想对此题进行求解(不会动态规划的戳链接)
- 如果字串 [i, j] 是回文子串,那么 [i - 1, j - 1] 也一定为回文子串。因此,只需要对判断回文子串的字串 [i - 1, j - 1] 进行判断即可,所以递推公式为 dp [i][j] = dp [i + 1][j - 1]
- 还需要考虑边界情况,当子串长度为1时,一定是回文子串,同时保证右边界越界不能越界
三、知识储备
利用 vector 初始化二维数组
一维初始化为:vector<int> array;
vector<int> array(5);//初始化5个空间
vector<int> vec(4,2);//初始化4个空间,并赋初值为2
二维初始化为:vector<vector<int>> array(n, vector<int>(m, initKey))
//初始化为n * m的数组,并附初值initKey, 初值也可以不赋
四、编写代码
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();//input length
if (n < 2) return s;//length = 1 must be correct
int maxLen = 1;//max Length
int begin = 0;//start position
vector<vector<int>> dp(n, vector<int>(n));//judge whether palindromic substring
for (int i = 0; i < n; i++) dp[i][i] = true;//init
for (int L = 2; L <= n; L++)
{
for (int i = 0; i < n; i++)
{
int j = L + i - 1;//right side
if (j >= n) break;//right side overflow
if (s[i] != s[j]) dp[i][j] = false;//if not equal, false
else {
if (j - i < 3) dp[i][j] = true;//bound situation
else dp[i][j] = dp[i + 1][j - 1];//recursion formula
}
if (dp[i][j] && j - i + 1 > maxLen) { //judge max length and record
maxLen = j - i + 1;//record max length
begin = i;//record begin position
}
}
}
return s.substr(begin, maxLen);//return palindromic substring
}
};
五、测评结果
动态规划就是用空间换时间。
六、总结评价
本题主要考察对动态规划的掌握程度,动态规划在各种竞赛以及大厂面试中,经常出现的题目,一定要好好掌握。
有问题欢迎各位大佬指出
力扣系列将持续更新,欢迎关注,一起学习