Description
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
Example 1:1
2
3Input: text1 = "abcde", text2 = "ace"
Output: 3
Explanation: The longest common subsequence is "ace" and its length is 3.
Example 2:1
2
3Input: text1 = "abc", text2 = "abc"
Output: 3
Explanation: The longest common subsequence is "abc" and its length is 3.
Example 3:1
2
3Input: text1 = "abc", text2 = "def"
Output: 0
Explanation: There is no such common subsequence, so the result is 0.
Constraints:
- 1 <= text1.length <= 1000
- 1 <= text2.length <= 1000
- The input strings consist of lowercase English characters only.
Solution
Solution 1: DP
1 | class Solution { |
Solution 2: Recursion with memory1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class Solution {
public int longestCommonSubsequence(String text1, String text2) {
return helper(text1, 0, text2, 0, new int[text1.length()][text2.length()]);
}
private int helper(String s1, int index1, String s2, int index2, int[][] memory){
if (index1 >= s1.length() || index2 >= s2.length()) return 0;
if (memory[index1][index2] > 0) return memory[index1][index2] - 1;
if (s1.charAt(index1) == s2.charAt(index2))
return helper(s1, index1 + 1, s2, index2 + 1, memory) + 1;
else {
memory[index1][index2] = Math.max(helper(s1, index1 + 1, s2, index2, memory), helper(s1, index1, s2, index2 + 1, memory));
memory[index1][index2]++;
return memory[index1][index2]-1;
}
}
}