题目链接
思路:
-
首先了解到题目所说的子序列指的是,只要顺序能对的上,就算子序列
-
我们考虑到本题,适合使用 dp 动态规划思想去做,对于 text1 text2 俩个字符串,我们模拟取最大值, dp[i][j] 数组 代表了 text[i-1] 和 text[j-1] 当前元素字符串所能得到的 最大子序列的结果值,那么我们需要特殊考虑 当 dp[0][j] dp[i][0] 的元素,这些都需要赋初值为0,
-
dp[i][j] 会出现俩种情况,text1[i-1] 等于 text2[j-1] 或者不相等,首先我们看相等的情况,相等的话 dp[i][j] 应该是等于 dp[i-1][j-1]+1 等于在不包含本次相等情况的字符时,所得到的最大值 +1
text1[i-1] 和 text2[j-1] 不相等的情况那就是,需要比较,在 不取text1当前位置 i-1 的情况,以及 不取 text2 当前位置 j-1 的情况,俩个之中的最大值。就能得到当前位置的结果,简单说就是,不包含 当前位置 i 的字符元素 或者 当前位置 j 的字符元素
代码:
javascript
/**
* @param {string} text1
* @param {string} text2
* @return {number}
*/
var longestCommonSubsequence = function (text1, text2) {
let dp = new Array(text1.length + 10).fill(0).map(item => new Array(text2.length + 10).fill(0))
for (let i = 0; i <= text1.length; i++) {
for (let j = 0; j <= text2.length; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0
continue
}
if (text1[i - 1] === text2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1
}
else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
}
}
return dp[text1.length][text2.length]
};