Longest Common Subsequence
第23天。
今天的题目是 Longest Common Subsequence :
Given two strings text1
and text2
, return the length of their longest common subsequence.
A subsequence of a string is a new string generated from the original string with some characters(can be none) deleted without changing the relative order of the remaining characters. (eg, “ace” is a subsequence of “abcde” while “aec” is not). A common subsequence of two strings is a subsequence that is common to both strings.
If there is no common subsequence, return 0.
Example 1:
1 | Input: text1 = "abcde", text2 = "ace" |
Example 2:
1 | Input: text1 = "abc", text2 = "abc" |
Example 3:
1 | Input: text1 = "abc", text2 = "def" |
Constraints:
1 <= text1.length <= 1000
1 <= text2.length <= 1000
- The input strings consist of lowercase English characters only.
这是一道比较经典的动态规划问题吧,它的动规方程为:
$$
\begin{aligned}
LCS(i,j) = \left{
\begin{array}{rcl}
& LCS[i-1, j-1] + 1 & ,{s1[i] = s2[j]} \
& max(LCS[i, j-1], LCS[i-1, j]) & ,{s1[i] \neq s2[j]}
\end{array}
\right.
\end{aligned}
$$
根据动规方程我们可以写出如下代码:
1 | int longestCommonSubsequence(string text1, string text2) { |
这里的空间复杂度可以继续进行优化,因为LCS[i,j]
只与当前行和上一行有关系,所以可以优化成两个数组来做:
1 | int longestCommonSubsequence(string text1, string text2) { |
再进一步的话,我们可以发现dp[i][j]
只与 dp[i-1][j-1]
,dp[i-1][j]
,dp[i][j-1]
相关,如果我们只用一个数组的话,dp[i][j]
与dp[i-1][j]
其实存在同一个位置,而dp[i][j-1]
是在同一行,所以我们只需要维护一个prev
变量来保存dp[i-1][j-1]
的值即可:
1 | int longestCommonSubsequence(string text1, string text2) { |