建议的字符串比较时间复杂度

时间:2016-10-27 05:46:18

标签: python algorithm python-2.7 time-complexity

我正在处理一个问题,找到给定字符串的完全重复的最短子字符串,如果没有匹配,则返回该字符串的长度。

我的主要想法是从Juliana的答案(Check if string is repetition of an unknown substring)中学到的,我在Python 2.7中重写了算法。

我认为它应该是O(n^2),但不相信我是正确的,这是我的想法 - 因为在外部循环中,它尝试使用开始字符迭代的可能性 - 它是{{1}外部循环,在内部循环中,它逐个比较字符 - 它是O(n)内部比较。那么,总体时间复杂度是O(n)?如果我不对,请帮助纠正。如果我是对的,请帮忙确认。 :)

输入和输出示例

O(n^2)

我的代码

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

1 个答案:

答案 0 :(得分:1)

您对重写的运行时间的评估是正确的。

但是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)

- 您连续两次将word[0:i]word[i:2*i]进行比较。)