您的位置:首页 > 编程语言 > Python开发

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

2017-08-17 23:46 519 查看
【题目】

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

【基本思路】

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

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

判断一个字符串是否是另一个字符串的子串,使用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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 python
相关文章推荐