题目
如果将一个 str1 从任意的位置切分开,分成两部分,将后面一部分放置在前面, 再组合起来成为 str2,构成了旋转词。
例如:str1 = “apple”,str2 = “leapp”,两个词就是旋转词。
代码
def is_rotation(str1, str2):
if str1 == "" or str2 == "" or len(str1) != len(str2):
return False
str_double = str1 + str1
if str2 in str_double:
return True
else:
return False
分析
1、若为空字符串,就没有旋转这个含义,如果两个字符串长度不相等,也不可能互为旋转。
2、将其中一个字符串翻倍,则另一个如果是旋转词的话,一定在翻倍的字符串中。
3、由于len是个函数,其时间复杂度是 o(m),空间复杂度是 o(m),匹配字符串的复杂度为 o(m+n)。所以总的来说,时间复杂度为 o(m+n)
体会
1、讲真,由于python的封装真的太好,我直接使用了 in关键字,或者 字符串内置的 find方法也好,这两种方法具体内在的算法复杂度我还没有了解过。但是这里有几种字符串匹配算法,
KMP算法:从前往后匹配,尽最大努力在匹配失败后从失败处继续匹配;
BM算法:从后往前匹配,同样是尽量减少不必要的匹配。
时间复杂度,均为两个字符串长度级别。