我正在研究一个问题来寻找给定字符串的完全重复的最短子串,如果没有匹配,则返回字符串的长度。
我的主要想法是从juliana的答案中学习到的(Check if string is repetition of an unknown substring),我在python 2.7中重写了算法。
我认为应该是O(n^2),但我不确定我是对的,这是我的想法--因为在外循环中,它尝试了开始字符迭代的可能性--它是O(n)外循环,在内循环中,它逐个比较字符--它是O(n)内比较。那么,总体时间复杂度O(n^2)?如果我不正确,请帮助纠正如果我是对的,请帮忙确认:)
输入输出示例

catcatcat => 3
aaaaaa=>1
aaaaaba = > 7

我的密码,
def rorate_solution(word):
    for i in range(1, len(word)//2 + 1):
        j = i
        k = 0
        while k < len(word):
            if word[j] != word[k]:
                break
            j+=1
            if j == len(word):
                j = 0
            k+=1
        else:
            return i

    return len(word)

if __name__ == "__main__":
    print rorate_solution('catcatcat')
    print rorate_solution('catcatcatdog')
    print rorate_solution('abaaba')
    print rorate_solution('aaaaab')
    print rorate_solution('aaaaaa')

最佳答案

您对重写运行时的评估是正确的。
Use just the preprocessing of KMP to find the shortest period of a string
(重写可能更简单:

def shortestPeriod(word):
    """the length of the shortest prefix p of word
    such that word is a repetition p
    """
# try prefixes of increasing length
    for i in xrange(1, len(word)//2 + 1):
        j = i
        while word[j] == word[j-i]:
            j += 1
            if len(word) <= j:
                return i

    return len(word)

if __name__ == "__main__":
    for word in ('catcatcat', 'catcatcatdog',
                 'abaaba',  'ababbbababbbababbbababbb',
                 'aaaaab', 'aaaaaa'):
        print shortestBase(word)

-你的比较是连续两次

09-16 06:27
查看更多