【问题标题】:How to mark the differences between two strings如何标记两个字符串之间的差异
【发布时间】:2020-01-17 00:00:38
【问题描述】:

我想要一个可以直观地标记两个字符串之间差异的函数。

示例 1:

输入:

  • 堆栈溢出
  • 堆栈溢出

输出:

  • 堆栈 [O]verflow
  • 堆栈 [o]overflow[ing]

示例 2:

输入:

  • 重新堆栈溢出
  • 堆栈-Ooooverflow

输出:

  • [Res]tack[]溢出
  • [S]tack[-]O[ooo]verflow

我已经搜索了很多,但我总是以文件比较功能结束。我想可视化字符串之间的区别。我发现的一个例子是https://text-compare.com(这正是我需要的),但它似乎使用了服务器端代码。

语言并不重要,JavaScript、Python,但任何如何解决这个问题的指针都会很好。

我不一定要寻找实现;我宁愿有一些网站的链接,因为这不是一个基本问题。也不是太难,但你想把它做好。

【问题讨论】:

  • 嗯,编辑距离和序列很有趣,但我不知道如何使用它们来解决这个问题。
  • 解决方案需要走多远?如果将 stack overflowstack is overflowing 比较会发生什么,哪些位会突出显示?我想你会想要[the] stack [is] overflow[ing],但是与the flow stack is overflowing 相比,这变得无限复杂 - 单词流在那里两次(一次作为差异,一次作为相等)但两者都会突出显示。

标签: string algorithm


【解决方案1】:

这个问题可以通过找到两个字符串的longest common subsequence (LCS) 来解决,然后只在不属于 LCS 的部分加上方括号。

例如Stack OverflowStack ooverflowing的LCS是Stack verflow,所以第一个字符串会被渲染成Stack [O]verflow,第二个字符串会被渲染成Stack [oo]verflow[ing],因为这些是LCS中不存在的部分.

有一个 standard dynamic programming algorithm 用于计算 Wikipedia 上描述的 LCS,以及该算法的各种 optimisations 在实际情况下加速它。 LCS 中不存在的每个字符串的部分可以通过一个简单的循环来找到,该循环维护字符串中的当前索引和 LCS 中当前位置的另一个索引。

【讨论】:

    猜你喜欢
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多