动态规划—最长公共子序列
生活随笔
收集整理的這篇文章主要介紹了
动态规划—最长公共子序列
小編覺(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。
算法思路:
?
我們會(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)題。
- 上一篇: 动态规划—最长公共子串
- 下一篇: 动态规划—最小路径和