簡體   English   中英

查找最長的重復 substring,如果有多個候選,則出現次數最多

[英]Find longest repeated substring, most occurring if multiple candidates

我想創建一個 python 程序來查找最長的重復 substring,如果有多個候選者,則出現次數最多。 第一優先級是最長的,只有當有兩個相同長度的字符串最長時,它應該是 go 最多出現。 子字符串不允許重疊。 例子:

  • 如果有一個 4 個字符的字符串出現了兩次,一個 3 個字符的字符串出現了 3 次,它會返回 4 個字符的字符串。

  • 如果有一個 4 個字符的字符串出現兩次,一個 4 個字符的字符串出現兩次,它將返回出現兩次的那個。

  • 如果沒有出現多次的模式,它將返回原始字符串。

  • 如果您有字符串“grhasdfjlksegkasdfdfshlgkjsdngbkj”,它將返回“asdf”,因為這是最常出現的 substring。

這是我到目前為止嘗試過的代碼:

line = "grhasdfjlksegkasdfdfshlgkjsdngbkj"
li = list(line)
c = 0
pu = 0
m = {}
for s in li:
    sta = s
    if pu == 0:
        css = c
        oln = line
        while True:
            st = sta + li[css+1]
            print(st)
            ln = line
            for i in range(pu):
                ln = ln[:css+i] + ln[(css+i+1):]
            if st in ln:
                pu += 1
                css += 1
                oln = line
                sta = st
            else:
                m[pu] = sta
                line = oln
                break
            c += 1
    else:
        pu -= 1

您的方法可能是固定的,但它似乎是從基本原則開始的。

為什么不使用 Python 提供的功能:

def most_common_longest_recurring_substring(s):
    # this works for non-overlapping substrings, as it uses str.count()
    m, r = 0, ''  # m is the best count so far, r the string in question
    for n in range(len(s) - 1, 0, -1):
        for i in range(len(s) - n):
            if 1 < s.count(s[i:i+n]) > m:
                m = s.count(s[i:i+n])
                r = s[i:i+n]
        # once any result has been found, stop because you favour length over count
        if m > 0:
            return r


x = most_common_longest_recurring_substring('abcde')
print(x)
x = most_common_longest_recurring_substring('abcdea')
print(x)
x = most_common_longest_recurring_substring('abcdabc')
print(x)
x = most_common_longest_recurring_substring('grhasdfjlksegkasdfdfshlgkjsdngbkj')
print(x)

Output:

None
a
abc
asdf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM