https://leetcode.com/problems/longest-palindromic-substring
此题有较多的解法,在此用了动态规划的做法:
https://www.cnblogs.com/grandyang/p/4464476.html
dp[j][i] : 表示 下标为 从 j -> i 的字符串是否为回文字符串。
可以做如下判断:
- 初始 当 j==i 时,dp[][] = 1;
- 当 s[i] == s[j] && i-j <2 ,即二者相等或相邻 dp[][] = 1;
- 当 s[i] == s[j] && dp[j+1][i-1]==1 时, dp[j][i] = 1;
每当dp为1时,记录此时的长度和坐标,返回最长的回文子串即可。
class Solution {
public:
string longestPalindrome(string s) {
if (s.empty())return "";
int n = s.size();
int dp[n][n] = {0}; // [j,i]
int len = 0,left=0,right=0;
for (int i=0;i<n;i++)
{
dp[i][i] = 1;
for (int j=0;j<i;j++)
{
dp[j][i] = (s[j]==s[i]) && (i-j<2 || dp[j+1][i-1]);
if (dp[j][i])
{
if ((i-j+1)>len){
len = i-j +1;
left = j;
right = i;
}
}
}
}
return s.substr(left,right-left+1);
}
};