2020-10-04 19:32:08 +05:30
|
|
|
|
/*
|
|
|
|
|
|
* Given two sequences, find the length of longest subsequence present in both of them.
|
|
|
|
|
|
* A subsequence is a sequence that appears in the same relative order, but not necessarily contiguous.
|
|
|
|
|
|
* For example, “abc”, “abg”, “bdf”, “aeg”, ‘”acefg”, .. etc are subsequences of “abcdefg”
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
function longestCommonSubsequence (x, y, str1, str2, dp) {
|
|
|
|
|
|
if (x === -1 || y === -1) {
|
|
|
|
|
|
return 0
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (dp[x][y] !== 0) {
|
|
|
|
|
|
return dp[x][y]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (str1[x] === str2[y]) {
|
|
|
|
|
|
dp[x][y] = 1 + longestCommonSubsequence(x - 1, y - 1, str1, str2, dp)
|
|
|
|
|
|
return dp[x][y]
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dp[x][y] = Math.max(longestCommonSubsequence(x - 1, y, str1, str2, dp), longestCommonSubsequence(x, y - 1, str1, str2, dp))
|
|
|
|
|
|
return dp[x][y]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-10 17:00:21 +02:00
|
|
|
|
// Example
|
|
|
|
|
|
|
|
|
|
|
|
// const str1 = 'ABCDGH'
|
|
|
|
|
|
// const str2 = 'AEDFHR'
|
|
|
|
|
|
// const dp = new Array(str1.length + 1).fill(0).map(x => new Array(str2.length + 1).fill(0))
|
|
|
|
|
|
// const res = longestCommonSubsequence(str1.length - 1, str2.length - 1, str1, str2, dp)
|
2020-10-04 19:32:08 +05:30
|
|
|
|
|
2021-10-10 17:00:21 +02:00
|
|
|
|
export { longestCommonSubsequence }
|