题解 | #最长公共子序列(一)#
最长公共子序列(一)
https://www.nowcoder.com/practice/672ab5e541c64e4b9d11f66011059498
const rl = require("readline").createInterface({ input: process.stdin }); const inputs = []; rl.on("line", (line) => { inputs.push(line); }).on("close", () => { resolve(inputs); }); function resolve(inputs) { const m = parseInt(inputs[0].split(" ")[0]); const n = parseInt(inputs[0].split(" ")[1]); const a = inputs[1].split(''), b = inputs[2].split(''); // dp[i][j] 字符串a 和 字符串b 的最长公共子序列长度 // if a[i] === b[j] => dp[i][j] = dp[i-1][j-1] + 1 // else => dp[i][j] = max(dp[i-1][j], dp[i][j-1]) // 如果对于递推公式有疑问的,可以打表。把过程表打出来就清楚递推公式怎么来的 // dp[0][0] = 0 // l -> r const dp = Array.from(Array(m + 1), () => Array(n + 1).fill(0)); let res = 0; for (let i = 1; i <= m; i++) { for (let j = 1; j <= n; j++) { // 这里有个坑:容易写成 a[i] === b[j], 要清楚这里是字符串比较,下标是从0开始,所以应该是a[i-1] === b[j-1] if (a[i-1] === b[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]); } res = Math.max(dp[i][j], res); } } console.log(res); }
步骤:
按照动归5步:
- 明确dp数组的含义
- 确定递推公式
- 初始化
- 遍历顺序
- 打表
其实也可以通过打表来确定递推公式,从简单情况推出递推公式更简单理解一些。