日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划-最长回文子串

發布時間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划-最长回文子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
輸入: "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最為兩個下標的間距,然后遍歷每種可能的結果判斷是否回文,最長的子串最后判斷,講符合條件的子串保存起來。動態規劃方程推測極為重要。

?

總結

以上是生活随笔為你收集整理的动态规划-最长回文子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。