求给定字符串中的最大回文子字符串。
1、遍历法
class Solution {
public:
string longestPalindrome(string s) {
if (s.empty()) return s;
size_t size = s.size();
int maxLen = 1;
int start = 0;
int i = 0, j = 0;
for (int j = 0; j < size; ++j)
{
for (int i = 0; i < j; ++i)
{
if(s[i] == s[j])
{
int len = (j - i + 1);
if ((i+1) == j and len > maxLen)
{
maxLen = len;
start = i;
}
else
{
if (isPalindrome(std::move(s.substr(i + 1, j - 1 - i))) and len > maxLen)
{
maxLen = len;
start = i;
}
}
}
}
}
return s.substr(start, maxLen);
}
private:
bool isPalindrome(const string&& s)
{
return s == string(s.rbegin(), s.rend());
}
};
不满足时间要求
2、动态规划(网络答案)
class Solution {
public:
string longestPalindrome(string s) {
if (s.empty()) return s;
int len = s.size();
if (len == 1) return s;
int longest = 1;
int start = 0;
vector<vector<int> > dp(len, vector<int>(len));
for (int i = 0; i < len; i++)
{
dp[i][i] = 1;
if(i < len-1)
{
if (s[i] == s[i + 1])
{
dp[i][i + 1] = 1;
start=i;
longest=2;
}
}
}
for (int l = 3; l <= len; l++)
{
for (int i = 0; (i+l-1) < len; i++)
{
int j = l+i-1;
if (s[i] == s[j] and dp[i+1][j-1] == 1)
{
dp[i][j] = 1;
start = i;
longest = l;
}
}
}
return s.substr(start,longest);
}
};
看来在算法方面得加强训练。