题目链接
1143. 最长公共子序列 - 力扣(LeetCode)
思路:
1. 首先了解到题目所说的子序列指的是,只要顺序能对的上,就算子序列
2. 我们考虑到本题,适合使用 dp 动态规划思想去做,对于 text1 text2 俩个字符串,我们模拟取最大值, dp[i][j] 数组 代表了 text[i-1] 和 text[j-1] 当前元素字符串所能得到的 最大子序列的结果值,那么我们需要特殊考虑 当 dp[0][j] dp[i][0] 的元素,这些都需要赋初值为0,
2. 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 的字符元素
代码:
/** * @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] };