什么是以与版本页面上的SO相同的方式对两个字符串进行区分的算法?
我试图逐个区分两个字符串,类似于StackOverflow在版本编辑页面上对两个字符串进行区分的方式。 这样做的算法是什么? 是否有gem或其他标准库可以实现这一目标?
编辑:我已经看到其他差异算法(与Ruby不同),他们似乎导致以下结果:
>> o = 'now is the time when all good men.' >> p = 'now some time the men time when all good men.' >> Differ.diff_by_word(o,p).format_as(:html) => "now someis time the men time when all good men."
请注意单词基于每个单词的差异? 我希望通过短语进行更多区分,所以上面的代码输出:
=> "now some time the menis the time when all good men."
我希望得到太多吗?
您正在寻找的算法是最长公共子序列,它为您完成大部分工作。
大纲是这些方面的东西。
- 按字分割(输入,输出)
- 计算输入/输出arrays上的LCS。
- 遍历arrays并智能地连接区域。
例如,你说你有:
“你好世界这是一个考验”
和….相比:
“先生你好世界”
LCS的结果是
- “先生”+
- “你好”=
- “世界”=
- “这个” –
- “是” –
- “一个” –
- “测试” –
现在你在建立时撒上特制的酱汁。 您将字符串连接在一起,同时注意前一个操作。 朴素算法只是连接相同动作的部分。
- “先生”+
- “你好世界”=
- “这是一个测试” –
最后你将它转换为html:
mister hello world this is a test
当然魔鬼在细节上:
- 您需要考虑如何处理标签
- 你比较markdown或html吗?
- 是否存在UI停止有意义的边缘情况。
- 您是否需要特殊处理标点符号。