题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例1
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案
思路:
动态规划:
当 i == j,dp[i][j]是回文子串(单字符都是回文子串);
当j - i < 3,只要s[i] == s[j],则dp[i][j]是回文子串(如 aa,aba),否则不是;
当j - i >= 3,如果s[i] == s[j] && dp[i+1][j-1],则dp[i][j]是回文子串,否则不是。
可以AC的代码
C++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size();
if (len <= 1) return s;
int maxlen = 1;
int start = 0;
//建立一个len x len 的矩阵dp,令dp[i][j]表示s[i]至s[j]所表示的子串是否为回文子串
vector<int>temp(len, 0);
vector<vector<int> >dp(len,temp);
//bool dp[len][len]; //LeetCode可以通过,VC不知道为什么就不行,故换成了上面的vector
for (int j = 0; j < len; j++)
{
for (int i = 0; i <= j; i++)
{
if (j - i < 3)
dp[i][j] = (s[i] == s[j]);
else
dp[i][j] = ((s[i] == s[j]) && dp[i + 1][j - 1]);
if (dp[i][j] && maxlen < j - i + 1)
{
maxlen = j - i + 1;
start = i;
}
}
}
//cout << s.substr(start, maxlen) << endl;
return s.substr(start, maxlen);
}
};
int main()
{
Solution s1;
string s, b;
s = "hello world";
b = s1.longestPalindrome(s);
//cout << b << endl;
return 0;
}