动态规划—最长公共子序列
生活随笔
收集整理的這篇文章主要介紹了
动态规划—最长公共子序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述:給定兩個字符串?text1 和?text2,返回這兩個字符串的最長公共子序列的長度。比如:text1 = "abcde",?text2 = "ace" ,最長公共子序列是 "ace",它的長度為 3。
算法思路:
?
我們會發現遍歷兩個串字符,當不同時需要考慮兩層遍歷前面的值(關系傳遞),也就是左邊和上邊的其中較大的值,當想相同時,需要考慮各自不包含當前字符串的子序列長度,再加上1。因此可以得出:
現在對比的這兩個字符不相同的,那么我們要取它的「要么是text1往前退一格,要么是text2往前退一格,兩個的最大值」:dp[i + 1][j + 1] = Math.max(dp[i+1][j], dp[i][j+1]);
對比的兩個字符相同,去找它們前面各退一格的值加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++) {// 獲取兩個串字符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往前退一格,兩個的最大值dp[i + 1][j + 1] = Math.max(dp[i + 1][j], dp[i][j + 1]);}}}return dp[m][n];} }總結
以上是生活随笔為你收集整理的动态规划—最长公共子序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态规划—最长公共子串
- 下一篇: 动态规划—最小路径和