如何在字符串列表中找到重复模式?

时间:2013-01-07 21:29:55

标签: c# pattern-matching design-patterns

我有一个跟踪流程的方法列表。我想检测是否在循环中调用了任何内容。例如,我可能有

method1
    method2
    method2
    method2

可能会在可能的循环中显示由method1调用的方法2。

method3
    method1
    methodd
    methoda
    methodb
    methodc
    methodd
    methoda
    methodb
    methodc
    methodd

在可能的循环中显示'methoda,methodb,methodc,methodd 2次。

显然,不能保证存在循环,但至少我们知道存在重复模式。唯一的输入是子项列表(例如,来自上面的method2,method2,method2)。

2 个答案:

答案 0 :(得分:1)

您可以按顺序将子列表插入到链接列表中,然后运行链表循环检测算法。

e.g。有两个指针,一个指针一次移动一个节点,另一个指针一次移动两个节点,如果存在一个循环,速度越快的指针最终将与慢速指针在同一个节点上

答案 1 :(得分:1)

构建后缀数组以及最长公共前缀,并找到值为>的K个连续LCP。阈值(其中K是另一个阈值)

在搜索中,要求找到的后缀'候选LCP在源字符串中是连续的/不重叠。 搜索算法:

let minimum_iterations = 1
let minimum_pattern_length = 2
let src = source string
let suffix = sorted suffix array, 
             where each entry is suffix i0 (inclusive) to |src| (exclusive)
let lcp = longest common prefixes, 
             where lcp(i) = longest common prefix of suffix(i) and suffix(i-1) when i > 0,
             or 0 if i = 0

for i = 0 to |suffix|:
    if lcp[i] < minimum_pattern_length: continue        
    let j = i
    let iterations = 0
    let last_matched_i0 = suffix[i-1].i0
    while j < |suffix| and lcp[j] >= lcp[i]:
        if (suffix[j].i0 + lcp[i] + 1) = last_matched_i0: 
            iterations++
            last_matched_i0 = suffix[j].i0
        j++

    print 'pattern = ' .. suffix[i][0..lcp[i]] .. ' iterations = ' .. iterations
    print 'starting at ' .. suffix[j-1].i0 .. ' to ' .. suffix[i-1].i0 + lcp[i]

    skip pattern if wanted

(suffix[j].i0 + lcp[i] + 1) = last_matched_i0 确保匹配的模式是连续的。 我们假设suffix[j]包含suffix[j-1],如果它们都是模式,因为在排序后缀数组ab中总是会出现abab

实施例: 3ababab65

后缀

  • 3ababab65
  • ababab65
  • babab65
  • abab65
  • bab65
  • AB65
  • B65
  • 65
  • 5

排序后缀以及最长公共前缀(LCP - 后缀): LCP(i)是SUFFIX(i)和SUFFIX(i-1)之间最长的公共前缀

  • 0 - 5
  • 0 - 65
  • 0 - 3ababab65
  • 0 - ab65
  • 2 - ab ab65
  • 4 - abab ab65
  • 0 - b65
  • 1 - b ab65
  • 3 - bab ab65

LCP候选人:

  • ab 65, ab ab65, ab abab65 - 连续,无重叠
  • abab 65, abab ab65 - 重叠
  • b 65, b ab65 - 不连续
  • bab 65, bab ab65 - 重叠

可能的模式:

  • AB

您必须稍微修改代码才能处理以下情况:

您的后缀为aba和ababa,LCP为3


或者你可以这样做...... Shortest Repeating Sub-String ... Donno它的效率如何......但更容易。