function diffBetweenTwoStrings(source, target) {
console.log(source);
console.log(target);
let output = [],
result = getCompareMap(source, target);
buildTheResult(result, source, target);
console.log(result);
constructOutput(source, target, result, output)
return output;
}
function buildTheResult(result, source, target) {
for (let row = 0; row < target.length; row++) {
for (let col = 0; col < source.length; col++) {
if (source[col] === target[row]) {
result[row + 1][col + 1] = result[row][col];
} else {
result[row + 1][col + 1] = Math.min(result[row + 1][col], result[row][col + 1]) + 1;
}
}
}
}
function constructOutput(source, target, result, output) {
let rows = target.length,
cols = source.length;
while (cols > 0 && rows > 0) {
// console.log(`source: ${source[cols-1]} target: ${target[rows-1]} result col+1: ${result[rows][cols]} row+1: ${result[rows][cols]}`);
if ((source[cols - 1] === target[rows - 1]) && ((result[rows - 1][cols - 1] <= result[rows - 1][cols]) && (result[rows - 1][cols - 1] <= result[rows][cols - 1]))) {
//&& (result[rows - 1][cols - 1] <= result[rows - 1][cols])) {
output.unshift(source[cols - 1]);
// console.log("diagonal up with " + source[cols - 1]);
rows--;
cols--;
} else if (result[rows - 1][cols] <= result[rows][cols - 1]) {
output.unshift("+" + target[rows - 1]);
// console.log("moving up with " + target[rows - 1]);
rows--;
} else if (result[rows][cols - 1] <= result[rows - 1][cols]) {
output.unshift("-" + source[cols - 1]);
// console.log("moving left with " + source[cols - 1]);
cols--;
}
}
while (rows > 0) {
if (result[rows - 1][cols] <= result[rows][cols]) {
output.unshift("+" + target[rows - 1]);
} else {
output.unshift(target[rows - 1]);
}
rows--;
}
while (cols > 0) {
if (result[rows][cols - 1] <= result[rows][cols]) {
output.unshift("-" + source[cols - 1]);
} else {
output.unshift(source[cols - 1]);
}
cols--;
}
}
function getCompareMap(source, target) {
let i, compareMap = [...Array(target.length + 1)].map(x => Array(source.length + 1).fill(0));
for (i = 0; i <= target.length; i++) {
compareMap[i][0] = i;
}
for (i = 0; i <= source.length; i++) {
compareMap[0][i] = i;
}
return compareMap;
}
// O(n^2)
let source = 'GMMGZGGLUGUH',
target = 'HPGPPMGLLUUU';
console.log(diffBetweenTwoStrings(source, target));
// expect => ["+H","+P","G","-M","+P","+P","M","G","-Z","-G","-G","L","+L","U","-G","U","-H","+U"]
// actual => ["+H","+P","G","+P","+P","M","-M","G","-Z","-G","-G","L","+L","U","-G","U","-H","+U" ]
source = "AABACC"
target = "BABCAC"
// Expected => ["-A","-A","B","A","+B","C","+A","C"]
// Actual => ["+B","A","-A","B","+C","A","C","-C"]
我错过了什么?
如果这是原来的问题,则包括以下但书:
如果有多个答案,请首先使用支持从源中删除的答案。
你的回答不符合这个标准。
下面是我的解决方案,但我不清楚“删除”的情况下代码应该是什么样子 删除字符的代码应该是什么样子的? 更新-添加了更多的示例 下面是Dmitry和Ingen答案的比较:https://dotnetfiddle.net/mjqdao
问题内容: 假设我们有类似的东西: 我想将“ someText”替换为其他内容。考虑到我不知道someText可能是什么(任何字符串)并且我所知道的是它将被&firstString =和&endString =包围的事实,最佳方法是什么? 编辑:对不起,看起来这还不够清楚。我不知道“ someText”可能是什么,我仅有的信息是它将位于&firstString =和&endString =之间 我
问题内容: 如何找到两个子字符串之间的字符串? 我当前的方法是这样的: 但是,这似乎效率很低而且不合Python。什么是做这样的更好的方法? 忘了提:该字符串可能无法启动,并最终和。他们之前和之后的字符可能更多。 问题答案:
问题内容: 我有一个字符串,例如:“这是应该使用的URL http://www.google.com/MyDoc.pdf ” 我只需要提取从http开始并以pdf结尾的URL:http: //www.google.com/MyDoc.pdf 这使我的输出为“应使用的http://www.google.com/MyDoc.pdf” 需要帮助。 问题答案: 这种问题是针对正则表达式进行的: 正则表达式
问题内容: 我需要从两个字符之间获取字符串。我有这个 并且必须在一个变量中分别返回4个字符串: 问题答案: 有。由于它接受正则表达式字符串,并且是正则表达式中的特殊字符,因此您需要对其进行转义(带有反斜杠)。而且,由于是在Java中字符串字面特殊字符,你需要逃脱 它 ,也一样,人们有时会感到迷惑。因此给出: 然后 将输出 ( 在 前三位上 有 尾随空格;如果需要,这些空格。)
这些声明有什么不同? 每种情况下的内存分配情况如何?