给定两个字符串,我想识别从最长到最短的所有常见子字符串 .
我想删除任何“子”子字符串 . 例如,'1234'的任何子串都不会包含在'12345'和'51234'之间的匹配中 .
string1 = '51234'
string2 = '12345'
result = ['1234', '5']
我想找到longest common substring,然后递归地找到左/右最长的子串 . 但是,我不希望在找到之后删除一个公共子字符串 . 例如,下面的结果在中间共享一个6:
string1 = '12345623456'
string2 = '623456'
result = ['623456', '23456']
最后,我需要针对数千个字符串的固定列表检查一个字符串 . 我不确定是否有一个聪明的步骤可以用来散列这些字符串中的所有子串 .
Previous Answers:
在这个thread中,发现了一个动态编程解决方案需要O(nm)时间,其中n和m是字符串的长度 . 我对更有效的方法感兴趣,它将使用后缀树 .
Background:
我正在用旋律片段创作歌曲旋律 . 有时,组合设法生成在现有的一行中匹配太多音符的旋律 .
我可以使用字符串相似性度量,例如编辑距离,但相信与旋律有很小差异的曲调是独特且有趣的 . 不幸的是,这些曲调与连续复制旋律的许多音符的歌曲具有相似的相似度 .
1 回答
让我们从树开始吧
要填充树,您将使用
.add_ngram
方法 .下一部分有点棘手,因为您正在寻找并发遍历字符串同时跟踪树坐标 . 为了解决所有这些问题,我们需要一些在树上运行的函数和一个查询字符串
所以现在做你想做的事,做到这一点:
如果有什么不清楚的地方,请告诉我,我会尽力澄清 .