首页 > 解决方案 > Python:使用递归来查看一个字符串是否是另一个字符串的旋转

问题描述

我尝试了下面的代码,但它不起作用。我收到一条错误消息“RecursionError:比较中超出了最大递归深度”。

def rot(str1, str2):
    if str1 == str2:
        return True
    else:
        for i, j in enumerate(str1):
            for k, l in enumerate(str2):
                if j == l:
                    a = str1
                    b = str2[k:] + str2[:k]
                    rot(a, b)
        return False

print(rot('ab', 'ba'))

标签: pythonstringrecursionrotation

解决方案


有一种简单但不一定明显的方法来检查 string 是否是 stringb的旋转a。验证长度是否匹配并加倍a。如果b是 的子串a + a,则您有一个旋转:

def rotation(a, b):
    return len(a) == len(b) and b in a + a

这值得亲自向自己证明,例如,检查helloin 的旋转hellohello


至于您的代码,我不了解嵌套循环或递归是如何解决问题的有用机制。一方面,没有基本情况,所以堆栈崩溃了。您需要一个 index 参数来跟踪已执行的旋转次数。

一种天真的、蛮力的方法是比较每一个可能的轮换,b直到a你找到解决方案或用尽所有可能的轮换:

def rot(str1, str2):
    if len(str1) == len(str2):
        for i in range(len(str1)):
            str2 = str2[-1] + str2[:-1]

            if str2 == str1:
                return True

    return False

第一个解的时间复杂度是线性的,第二个解是指数的。

试试看!


推荐阅读