链接:https://leetcode-cn.com/problems/longest-palindromic-substring
题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
解题思路链接:详细通俗的思路分析,多解法
对于字符串str,假设dp[i,j]=1表示str[i...j]是回文子串,那个必定存在dp[i+1,j-1]=1。这样最长回文子串就能分解成一系列子问题,可以利用动态规划求解了。首先构造状态转移方程
上面的状态转移方程表示,当str[i]=str[j]时,如果str[i+1...j-1]是回文串,则str[i...j]也是回文串;如果str[i+1...j-1]不是回文串,则str[i...j]不是回文串。
长度为 1 和长度为 2 的 dp(i,j)时不能用上边的公式,另行处理
class Solution {
public:
string longestPalindrome(string s) {
string res = "";
int length = s.size();
if(length == 0)
return res;
vector<vector<bool>> P(length,vector<bool> (length,false));
int maxLen = -1;
for(int len=1;len<=length;++len){
for(int start=0;start<length;++start){
int end = start + len - 1;
if(end >= length)
break;
P[start][end] = (len==1 || len==2 || P[start+1][end-1]) && s[start]==s[end];//len为1、2时也满足s[start]==s[end]的判断
if(P[start][end] && len>maxLen)
{
maxLen = len;
res = s.substr(start,len);//string.substr(pos,len)
}
}
}
return res;
}
};