字符串问题---判断两个字符串是否互为旋转词

【题目】

  如果一个字符str,把字符str前面任意的部分挪到后面形成的字符叫做str的旋转词。比如str = “12345”,str的旋转词有 “12345”, “23451”, “34512”, “45123”和“51234”。给定两个字符串a和b,请判断a和b是否互为旋转词。

【基本思路】

  1. 如果a和b的长度不一样,直接返回False。

  2. 生成一个大字符串c,c是两个字符串a拼在一起的结果,即c = a + a,只要判断b是否为c的子串即可。

  3. 判断一个字符串是否是另一个字符串的子串,使用KMP可以使时间复杂度达到O(N)。

下面是使用python3.5实现的代码

#判断两个字符串是否互为旋转词
def isRotation(str1, str2):
    def KMP(str1, str2):
        if str1 == None or str2 == None or len(str2) == 1 or len(str1) < len(str2):
            return False
        next = getNextArray(str2)
        si = 0 
        mi = 0
        while si < len(str1) and mi < len(str2):
            if str1[si] == str2[mi]:
                si += 1
                mi += 1
            elif next[mi] == -1:
                si += 1
            else:
                mi = next[mi]
        return True if mi == len(str2) else False

    def getNextArray(str1):
        if len(str1) == 1:
            return [-1]
        next = [0 for i in range(len(str1))]
        next[0] = -1
        next[1] = 0
        pos = 2
        cn = 0
        while pos < len(str1):
            if str1[pos-1] == str1[cn]:
                next[pos] = cn + 1
                pos += 1
                cn += 1
            elif cn > 0:
                cn = next[cn]
            else:
                next[pos] = 0
                pos += 1
        return next


    if str1 == None or str2 == None or len(str1) != len(str2):
        return False
    str3 = str1 * 2
    return KMP(str3, str2)

你可能感兴趣的:(数据结构与算法)