当前位置: 首页 > 知识库问答 >
问题:

两个字符串之间的差异

东门文斌
2023-03-14
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"]

我错过了什么?

共有1个答案

毋承基
2023-03-14

如果这是原来的问题,则包括以下但书:

如果有多个答案,请首先使用支持从源中删除的答案。

你的回答不符合这个标准。

 类似资料:
  • 下面是我的解决方案,但我不清楚“删除”的情况下代码应该是什么样子 删除字符的代码应该是什么样子的? 更新-添加了更多的示例 下面是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中字符串字面特殊字符,你需要逃脱 它 ,也一样,人们有时会感到迷惑。因此给出: 然后 将输出 ( 在 前三位上 有 尾随空格;如果需要,这些空格。)

  • 这些声明有什么不同? 每种情况下的内存分配情况如何?