在《算法图解》中看到动态规划算法,一直没有进行练习,今天恰好在Leecode刷到本题,可以用动态规划求解。动态规划法解决的问题一般是各种各样从表面上需要全部枚举各种情况的问题,其核心是通过把大问题分解成子问题,从而减小计算量。比如本题中的状态转移方程。状态规划法的时间复杂度一般为O(n2)。
代码和解题用的图如下。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Solution
{
public:
string longestPalindrome(string s)
{
int len = s.size();
string ans;
vector<vector<int>> dp(len, vector<int>(len));
int maxlen = 0;
int start = 0, end = 0, move = 0;
for (move = 0; move < len; move++)
{
for (start = 0; start + move < len; start++)
{
end = start + move;
if (move == 0)
{
dp[start][end] = 1;
}
else if (move == 1)
{
dp[start][end] = (s[start] == s[end]);
}
else
{
dp[start][end] = (dp[start + 1][end - 1]) && (s[start] == s[end]);
}
if (dp[start][end] == 1 && move + 1 > maxlen)
{
ans = s.substr(start, move + 1);
maxlen = move + 1;
}
}
}
return ans;
}
};
int main(int argc, char **argv)
{
Solution sl;
cout << sl.longestPalindrome("aaaa") << endl;
cout << sl.longestPalindrome("abadc") << endl;
cout << sl.longestPalindrome("wewexseabbadw") << endl;
return 0;
}
