动态规划-最长回文子串
生活随笔
收集整理的這篇文章主要介紹了
动态规划-最长回文子串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:輸入: "cbbd"
輸出: "bb"
? 下面看一下代碼:
#include<iostream> #include<string> #include<vector> using namespace std;//最長回文子串//動態規劃 class Solution { public:string longestPalindrome(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n)); //這是一個二維數組string ans;for (int k = 0; k < n; ++k) { for (int i = 0; i + k < n; ++i) {int j = i + k;cout << "i=" << i << "," << "j=" << j << endl;if (k == 0) {dp[i][j] = 1;}else if (k == 1) {dp[i][j] = (s[i] == s[j]);}else {//i ~ j 為回文子串dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);}if (dp[i][j] && k + 1 > ans.size()) {//substr提取字符串ans = s.substr(i, k + 1);}}cout << "--------------" << endl;}return ans;} };int main(){string str = "babad";Solution s;auto ret = s.longestPalindrome(str);cout << ret << endl;return 0; }? ?動態方程的推導和代碼地址見:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
程序運行輸出:
i=0,j=0? ? ? ? ? k=0時
i=1,j=1
i=2,j=2
i=3,j=3
i=4,j=4
--------------? k=1時
i=0,j=1
i=1,j=2
i=2,j=3
i=3,j=4
--------------? k=2時
i=0,j=2
i=1,j=3
i=2,j=4
-------------- k=3時
i=0,j=3
i=1,j=4
-------------- k=4時
i=0,j=4
--------------
bab
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]); 這段代碼用利用了 dp[i + 1][j - 1],這個結果是前面已經計算出來了,當k=4時,字符串最長,最后符合條件的回文子串最長。注意整個循環遍歷的過程,用k最為兩個下標的間距,然后遍歷每種可能的結果判斷是否回文,最長的子串最后判斷,講符合條件的子串保存起來。動態規劃方程推測極為重要。
?
總結
以上是生活随笔為你收集整理的动态规划-最长回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哈希表--两数之和
- 下一篇: 中心扩散算法--最长回文子串