字符串问题---判断两个字符串是否互为旋转词
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实现的代码
如果一个字符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)
相关文章推荐
- 判断两个字符串是否互为旋转词
- 判断两个字符串是否互为旋转词
- 判断两个字符串是否互为旋转词
- 判断两个字符串是否互为旋转词
- 判断子串和判断两个字符串是否由另一个旋转而来的问题
- 5.4 判断两个字符串是否互为旋转词(find函数)
- 判断两个字符串是否互为旋转词
- C++判断两个字符串是否互为旋转词
- 判断两个字符串是否互为旋转词 Python版
- 程序员面试金典: 9.1数组与字符串 8判断两个字符串中一个字符串是否由另一个字符串旋转而成
- 判断两个字符串是否互为变形词
- 判断两个字符串是否互为变形词
- 两个字符串hash问题:检查两个单词是否互为变位词和在一个字符串中第一个只出现一次的字符
- 【知识】java中判断两个字符串是否相等的问题
- java中判断两个字符串是否相等的问题
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1
- java中判断两个字符串是否相等的问题
- CTCI系列--1.3 判断两个字符串是否互为变换(C语言)
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1
- 5.1判断两个字符串是否互为变形词(输入流)