01 题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
02 示例
示例1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成
03 C++代码
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size(); //字符串的长度
if(len == 0 || len == 1)
return s; //如果长度为1,那么它自己就是回文串
int start = 0; //回文串起始位置
int max = 1; //回文串的最大长度
vector<vector<int>> dp(len, vector<int>(len)); //定义二维动态数组
for (int i = 0; i < len; i++){ // 初始化状态
dp[i][i] = 1;
if (i < len - 1 && s[i] == s[i+1]){
dp[i][i+1] = 1;
max = 2;
start = i;
}
}
for (int t = 3; t <= len; t++){ // t表示检索的子串长度,等于3表示先检索长度为3的子串
for (int i = 0; i + t - 1 < len; i++){
int j = t + i - 1; //终止字符位置
if(s[i] == s[j] && dp[i+1][j-1] == 1){ //状态转移
dp[i][j] = 1;
start = i;
max = t;
}
}
}
return s.substr(start, max); //获取最长回文子串
}
};
04 一点感想
动态规划求解
初始状态:
- dp[i][i]=1; //单个字符是回文串
- dp[i][i+1]=1 if s[i]=s[i+1]; //连续两个相同字符是回文串
参考题解链接:力扣
05 刷题进度
学习目标:坚持刷题 坚持刷题 坚持刷题!!!
那写看似毫无波澜的日复一日,会在某一天 让你突然发现努力的意义。
无悔昨天 & 感谢今天 & 喜欢明天~
一以贯之的努力,不得懈怠的人生。每天的微小积累,会决定最终的结果,这 就是答案!