【问题标题】:One Edit Distance Away一键编辑距离
【发布时间】:2020-07-27 12:21:08
【问题描述】:

我目前在休息时间做一些编码,为大学第二学期做好准备。

我遇到了一个我很难理解的 CTCI 问题,我也看过提示,但仍然对如何解决它有点无能为力

问题

One Away:可以对字符串执行三种类型的编辑:插入字符、删除字符或替换字符。给定两个字符串,编写一个函数来检查它们是一次编辑还是零次编辑

输入和输出示例

  • 输入 -> 苍白,ple 输出-> 真
  • 输入->苍白,苍白输出->真
  • 输入->苍白,大包输出->真
  • 输入 -> 苍白,烘焙 输出 -> 假

请不要给我解决方案 我已经阅读了提示,但仍然不明白我应该如何解决这个问题,我知道为了使插入有效,字符串 word1 和 word2 的长度必须相差 1。

在完成这个问题时,有人可以给我一些提示,告诉我应该从哪里开始。谢谢。

【问题讨论】:

  • 你怎么知道有 1 个字符被删除了?
  • 长度必须等于或小于或大于 1,但您还必须检查较小字符串中的所有字母是否在另一个字符串中,这样它们将是 1 或 0编辑掉

标签: java string algorithm


【解决方案1】:

首先将问题分解成更小的部分。

如果字符串相同,则没有变化,所以先检查相等性。

如果字符串不同,则有 3 种不同的结果:

  • 一个字符已被替换
  • 一个字符已被删除
  • 添加了一个角色

分别处理每种情况。添加一个尝试检测每种情况的新方法,并从解决方案的主要方法中调用这些方法。这将使代码结构更易于理解和测试。

在每种情况下,您都将使用循环来比较两个字符串中的字符。

要查找一个字符是否已被替换,请计算有多少个位置有不同的字符。如果恰好为 1,则为替换。如果超过 1 个,则为不同的编辑。

在继续删除和添加大小写之前,请确保您可以检测到 1 个字符替换。

要查找字符是否已被删除,请像上面一样计算具有不同字符的位置数,但稍作修改:当您发现差异时,增加其中一个计数器的位置,以便跳过一个字符在其中一个字符串中。现在这听起来令人困惑,但是一旦您编写了工作代码来检测上面的替换案例,就会更清楚。如果您遇到困难,您可以随时在此处发布新问题并获取有关代码的帮助。

【讨论】:

    【解决方案2】:

    提示但不是解决方案并不是一个好的 SO 问题!不过这里是:https://en.wikipedia.org/wiki/Levenshtein_distance

    【讨论】:

      【解决方案3】:

      比较从前面开始的字符串,找出它们共同前缀的长度。

      比较从末尾开始的字符串,找出共同后缀的长度。

      现在您可以完全根据两个字符串长度以及公共前缀和后缀长度来确定答案。

      【讨论】: