给出两份文件:
现在是我们不满的冬天 在约克的这个阳光下度过了美好的夏天; 还有我们家里所有的云彩 在深海怀抱的海洋中。 现在我们的眉毛上有胜利的花圈; 我们伤痕累累的双臂挂在纪念碑上; 我们严厉的警惕变成了欢乐的会议, 我们可怕的举措令人愉快。
(理查德三世)
理查德(约克公爵):[把他的高脚杯敲在桌子上三次]沉默! 安静!对于国王! 国王(理查德三世):[站立,弯腰,说话笨拙] 现在是我们甜蜜内容的夏天, [制造?] [错误?] - 这些都铎式云层施放过冬天。
(BlackAdder,第1季,第1集)
可以使用哪种算法来找出两个文档中存在哪些3字序列?如果有,当然 - 它不能保证。
在此示例中,“现在是”是两个文档中唯一出现的3个字序列。
答案 0 :(得分:2)
听起来你正在寻找长度为3的常见子串,除了“字符串”由你的“字符串”组成,实际上是单词,而不是单个字符。因此,“我有一个狡猾的计划”是一个长度为5的字符串。
此时通常会提到后缀树:http://en.wikipedia.org/wiki/Generalised_suffix_tree,但是否需要它取决于文本的长度。从每对字边界开始比较几个嵌套循环(每个字符串一个)将最终完成工作。
答案 1 :(得分:2)
没有蛮力,最简单的解决方案是制作一个哈希映射,其中包含一个文本的每个单词元组的条目,然后检查另一个文本中的每个元组是否存在于哈希映射中。在给定恒定窗口(3个字)的情况下,这将是线性的,但我们可以在线性时间内完成此操作,而与窗口大小无关。
为了有效地执行此操作,我们使用rolling hash。滚动哈希的输入字符将是单词的哈希值。这种技术称为Rabin-Karp algorithm。