我尝试了下面的代码,但没有用。我收到错误消息“ 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'))
答案 0 :(得分:3)
有一种简单但不一定明显的方法来检查字符串b
是否是字符串a
的旋转。验证长度是否匹配,并将a
加倍。如果b
是a + a
的子字符串,则可以进行轮换:
def rotation(a, b):
return len(a) == len(b) and b in a + a
这值得您亲自证明,例如,检查hello
中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
第一个解决方案的时间复杂度是线性的,第二个解决方案的时间复杂度是指数的。
答案 1 :(得分:1)
您忘记了return rot(a, b)
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]
return rot(a, b) #returns the value of recursion
return False
print(rot('ab', 'ba'))