最长回文子串
力扣中的题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。 示例 2:
输入: “cbbd” 输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
目前已有的解法中「暴力算法」是基础,「动态规划」必须掌握,「中心扩散」方法要会写;
「Manacher 算法」仅用于扩宽视野,绝大多数的算法面试中,面试官都不会要求写这个方法(除非面试者是竞赛选手)。
本文只讨论动态规划和中心扩散两种解法
动态规划
初始状态:
- dp[i][i]=1; //单个字符是回文串
- dp[i][i+1]=1 if s[i]=s[i+1]; //连续两个相同字符是回文串
string longestPalindrome(string s) {
int len = s.size();
if(len == 0 || len == 1){
return s;
}
//状态转移数组
//vector<vector<int>>dp(len, vector<int>(len));
int dp[1001][1001] = {
0};
int start = 0;//记录回文子串的起始点
int max = 1;//记录回文子串的长度
//初始化状态数组
//dp[i][i]初始化为1,即字符串s的每个字符都可以构成长度为1的回文子串
//判