Longest Common Subsequence (DP)

本文详细介绍了如何使用动态规划解决最长公共子序列问题,包括状态转移方程、初始化和返回值解释,并通过示例代码展示算法实现过程。

Given two strings, find the longest common subsequence (LCS).

Your code should return the length of LCS.

Example

For "ABCD" and "EDCA", the LCS is "A" (or "D", "C"), return 1.

For "ABCD" and "EACB", the LCS is "AC", return 2.

 

最长公共子序列的定义:

最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串).

State: f[i][j] 表示在字符串A中前i个字符与B字符串前j个字符的最长LCS。

Fuction: f[i][j] = max(f[i - 1][j], f[i][j - 1]) if (A[i -1] != B[j - 1]) 对应与 “abc” “ab” 和 “ab" 和”abc“。if(A[i - 1] == B[j - 1]) f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1][j -1] + 1).

Initialization: int [][] f = new int[A.length() + 1][B.length() + 1]

Answer:f[A.length()][B.length()]

 

 1 public class Solution {
 2     /**
 3      * @param A, B: Two strings.
 4      * @return: The length of longest common subsequence of A and B.
 5      */
 6     public int longestCommonSubsequence(String A, String B) {
 7         int m = A.length();
 8         int n = B.length();
 9         if (m == 0 || n == 0) {
10             return 0;
11         }
12         int[][] f = new int[m + 1][n + 1];
13         for (int i = 1; i <= m; i++) {
14             for (int j = 1; j <= n; j++) {
15                 f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);
16                 if (A.charAt(i - 1) == B.charAt(j - 1)) {
17                     f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + 1);
18                 }
19             }
20         }
21         return f[m][n];
22     }
23 }

 

        

 

转载于:https://www.cnblogs.com/FLAGyuri/p/5403103.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值