algorithm - 如何检测字符串列表中的公共(public)子字符串

标签 algorithm pattern-matching

给定一组字符串,例如:

EFgreen
EFgrey
EntireS1
EntireS2
J27RedP1
J27GreenP1
J27RedP2
J27GreenP2
JournalP1Black
JournalP1Blue
JournalP1Green
JournalP1Red
JournalP2Black
JournalP2Blue
JournalP2Green

我希望能够检测到这是三组文件:

  • 整个[1,2]
  • J27[红,绿]P[1,2]
  • JournalP[1,2][红、绿、蓝]

是否有解决此问题的任何已知方法 - 我可以阅读有关此问题的任何已发表论文?

我正在考虑的方法是为每个字符串查看所有其他字符串并找到共同字符和不同字符所在的位置,试图找到最共同的字符串集,但我担心这不是很有效并且可能会产生误报。

请注意,这与 'How do I detect groups of common strings in filenames' 不同因为这假设一个字符串后面总是跟有一系列数字。

最佳答案

我将从这里开始:http://en.wikipedia.org/wiki/Longest_common_substring_problem

外部链接中有指向补充信息的链接,包括文章中解释的两种算法的 Perl 实现。

编辑添加:

根据讨论,我仍然认为最长公共(public)子串可能是这个问题的核心。即使在您在评论中引用的 Journal 示例中,该集合的定义特征也是子字符串“Journal”。

我会首先考虑什么将集合定义为与其他集合分开。这给了你你的分区来划分数据,然后问题是衡量一个集合中存在多少共性。如果定义特征是公共(public)子串,那么最长公共(public)子串将是一个逻辑起点。

要使集合检测过程自动化,一般来说,您需要一种成对的共性度量,您可以使用它来衡量所有可能对之间的“差异”。然后,您需要一种算法来计算导致总体总差最低的分区。如果差异度量不是最长公共(public)子串,那很好,但是您需要确定它将是什么。显然,它需要是您可以衡量的具体事物。

另请记住,差异测量的属性将影响可用于进行分区的算法。例如,假设 diff(X,Y) 给出了 X 和 Y 之间差异的度量。那么如果您的距离度量是 diff(A,C) <= diff(A,B) + diff,它可能会很有用(公元前)。显然 diff(A,C) 应该与 diff(C,A) 相同。

考虑到这一点,我也开始怀疑我们是否可以将“差异”设想为任意两个字符串之间的距离,并且根据距离的严格定义,我们是否可以尝试某种 cluster analysis在输入字符串上。只是一个想法。

关于algorithm - 如何检测字符串列表中的公共(public)子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410822/

相关文章:

algorithm - 如何实现无间隙 block 布局算法?

algorithm - 如何删除最小-最大堆上的第 k 个元素?

php - Laravel 路线与模式不匹配

f# - 通过模式匹配比较 F# 区分的联合实例

scala - 具有折叠的抽象类型的模式匹配

scala - 如何避免 Scala 中使用模式匹配的 def 定义的语法开销?

javascript - 使用 ng-repeat、ng-model 和复选框获取数组中的位置

arrays - 用于堆化数组的堆中的 siftUp 和 siftDown 操作

algorithm - 解决这种逻辑问题的方法是什么?

javascript - 正则表达式以捕获组开始