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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

动态规划—最长公共子序列

發(fā)布時(shí)間:2024/4/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划—最长公共子序列 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

問(wèn)題描述:給定兩個(gè)字符串?text1 和?text2,返回這兩個(gè)字符串的最長(zhǎng)公共子序列的長(zhǎng)度。比如:text1 = "abcde",?text2 = "ace" ,最長(zhǎng)公共子序列是 "ace",它的長(zhǎng)度為 3。

算法思路:

  • 明確 dp 數(shù)組的含義:對(duì)于兩個(gè)字符串的動(dòng)態(tài)規(guī)劃問(wèn)題,套路是通用的。比如說(shuō)對(duì)于字符串 s1 和 s2,它們的長(zhǎng)度分別是 m、n,一般來(lái)說(shuō)都要構(gòu)造一個(gè)這樣的 DP table:int[][] dp = new int[m+1][n+1]。這里為什么要加1,原因是你可以不加1,但是不加1你就會(huì)用其它限制條件來(lái)確保這個(gè)index是有效的,而當(dāng)你加1之后你就不需要去判斷只是讓索引為0的行和列表示空串。
  • 定義 base case:我們專門(mén)讓索引為0的行和列表示空串,dp[0][...] 和 dp[...][0] 都應(yīng)該初始化為0,這就是base case。
  • 找狀態(tài)轉(zhuǎn)移方程:這是動(dòng)態(tài)規(guī)劃最難的一步,我們來(lái)通過(guò)案例推導(dǎo)出來(lái)。對(duì)于 text1:abcde 和 text2:ace 兩個(gè)字符串,我們定義兩個(gè)指針進(jìn)行遍歷 i 和 j。遍歷 text1 長(zhǎng)度為 m,定義指針 i,從 0~m。固定 i 指針(i == 1)位置,接下來(lái)開(kāi)始遍歷 text2 長(zhǎng)度為 n,定義指針 j,從 0~n。
  • ?

    我們會(huì)發(fā)現(xiàn)遍歷兩個(gè)串字符,當(dāng)不同時(shí)需要考慮兩層遍歷前面的值(關(guān)系傳遞),也就是左邊和上邊的其中較大的值,當(dāng)想相同時(shí),需要考慮各自不包含當(dāng)前字符串的子序列長(zhǎng)度,再加上1。因此可以得出:

    現(xiàn)在對(duì)比的這兩個(gè)字符不相同的,那么我們要取它的「要么是text1往前退一格,要么是text2往前退一格,兩個(gè)的最大值」:dp[i + 1][j + 1] = Math.max(dp[i+1][j], dp[i][j+1]);

    對(duì)比的兩個(gè)字符相同,去找它們前面各退一格的值加1即可:dp[i+1][j+1] = dp[i][j] + 1;

    class Solution {public int longestCommonSubsequence(String text1, String text2) {int m = text1.length(), n = text2.length();int[][] dp = new int[m + 1][n + 1];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 獲取兩個(gè)串字符char c1 = text1.charAt(i), c2 = text2.charAt(j);if (c1 == c2) {// 去找它們前面各退一格的值加1即可dp[i + 1][j + 1] = dp[i][j] + 1;} else {//要么是text1往前退一格,要么是text2往前退一格,兩個(gè)的最大值dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]);}}}return dp[m][n];} }

    總結(jié)

    以上是生活随笔為你收集整理的动态规划—最长公共子序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。