javascript - 尝试为不起作用的最大公共子字符串编写一个记忆解决方案
问题描述
我已经为 LCS 编写了这个记忆化的解决方案,但它似乎不起作用。我究竟做错了什么?
const lcsMemo = (s1, s2) => {
let i = 0, j = 0
const memo = Array.from(new Array(s1.length), () => Array(s2.length).fill(''))
console.log(memo);
const helper = (s1, s2, i, j, memo) => {
if (i === s1.length || j === s2.length) return 0
if (memo[i][j]) return memo[i][j]
if (s1[i] === s2[j]) {
return 1 + helper(s1, s2, i + 1, j + 1, memo)
}
else {
return memo[i][j] = Math.max(helper(s1, s2, i + 1, j, memo), helper(s1, s2, i, j + 1, memo))
}
}
return helper(s1, s2, i, j, memo)
}
我将它包含在此函数中以解决称为 common child 的 HackerRank 问题。我有 9/15 次测试通过,但是我无法查看的失败测试因消息运行时错误而失败。HackerRank 网站的运行时错误说明了该错误:
Your code terminated unexpectedly. Did you overrun your array? Is your code trying to divide by zero?
const commonChild = (s1, s2) => {
const arr1 = [],
arr2 = []
for (let [i, letter] of [...s1].entries()) {
let index = s2.indexOf(letter)
if (index > -1) {
arr1.push(letter)
}
}
for (let [i, letter] of [...s2].entries()) {
let index = s1.indexOf(letter)
if (index > -1) {
arr2.push(letter)
}
}
console.log(arr1.join(''));
console.log(arr2.join(''));
const lcsMemo = (s1, s2) => {
let i = 0, j = 0
const memo = Array.from(new Array(s1.length), () => Array(s2.length).fill(''))
const helper = (s1, s2, i, j, memo) => {
if (i === s1.length || j === s2.length) return 0
if (memo[i][j]) return memo[i][j]
if (s1[i] === s2[j]) {
return 1 + helper(s1, s2, i + 1, j + 1, memo)
}
else {
return memo[i][j] = Math.max(helper(s1, s2, i + 1, j, memo), helper(s1, s2, i, j + 1, memo))
}
}
return helper(s1, s2, i, j, memo)
}
return lcsMemo(arr1.join(''), arr2.join(''))
}
一些测试用例是:
console.log(commonChild('SHINCHAN', 'NOHARAAA')) //3 NHA
console.log(commonChild('AA', 'BB')) //0
console.log(commonChild('HARRY', 'SALLY')) //2 AY
console.log(commonChild('ABCDEF', 'FBDAMN')) //2 BD
解决方案
推荐阅读
- elasticsearch - Logstash 配置不适用于日志文件
- android - 当应用程序从 Android 的最近列表中删除时如何触发事件
- visual-c++ - 在 vs2017 中为控制台项目添加 Atl 支持
- javascript - 如何从对象中删除重复值
- java - Apache HTTPClient 给出连接被拒绝异常
- javascript - 使用 USB/wifi 将安卓屏幕镜像到笔记本电脑
- webpage - Microsoft Edge 在打开 Fiddler 之前不会打开网站
- javascript - 如何处理不同帖子的个人评论?
- c++ - Qt 隐形按钮在 Ubuntu 上不起作用
- c++ - 为什么在尝试打印字符串返回时出现编译器错误?