【題目】
如果乙個字串str,把字串str前面任意的部分挪到後面形成的字串叫作str的旋轉詞。
比如str=「12345」,str的旋轉詞 有"12345"、「23451」、「34512」、「45123"和"51234」。
給定兩個字串a和b,請判斷a和b是否互為旋轉詞。
若a和b長度不相等,則a和b必然不互為旋轉詞,直接返回false
【舉例】
a=「cdab」,b=「abcd」,返回true。
a=「1ab2」,b=「ab12」,返回false。
a=「2ab1」,b=「ab12」,返回true。
b+b組合的字串,包含b所有的旋轉詞,+表示字串拼接操作
其中任意長度為n的子串都是b的旋轉詞,n為字串b的長度
假設字串b的字元表示形式為b=b
0b1.
..bi
...b
n−
1b=b_0b_1...b_i...b_
b=b0b
1..
.bi
...b
n−1
b [0
:n]+
b[0:
0]=b
0b1.
..bi
...b
n−
1b[0:n]+b[0:0]=b_0b_1...b_i...b_
b[0:n]
+b[0
:0]=
b0b
1..
.bi
...b
n−1
b [1
:n]+
b[0:
1]=b
1b2.
..bi
...b
n−1b
0b[1:n]+b[0:1]=b_1b_2...b_i...b_b_0
b[1:n]
+b[0
:1]=
b1b
2..
.bi
...b
n−1
b0…
b [i
:n]+
b[0:
i]=b
ibi+
1...
bn−1
b0b1
...b
i−
1b[i:n]+b[0:i]=b_ib_...b_b_0b_1...b_
b[i:n]
+b[0
:i]=
bib
i+1
...b
n−1
b0b
1..
.bi−
1…b[n
:n]+
b[0:
n]=b
0b1.
..bi
...b
n−
1b[n:n]+b[0:n]=b_0b_1...b_i...b_
b[n:n]
+b[0
:n]=
b0b
1..
.bi
...b
n−1
第i個長度為n的字串為前i個字元移至後面的旋轉詞
因此b+b包含b所有的旋轉詞,其中任意長度為n的子串都是b的旋轉詞
判斷a與b是否互為旋轉詞,只需判斷a是否包含在組合字串b+b中,在則互為旋轉詞,不在則不互為旋轉詞
字串匹配使用kmp演算法,時間複雜度為o(n
)o(n)
o(n)
注意:kmp演算法可本地自行實現,詳見字串匹配;
也可使用字串庫函式
str1.find(str2)
,若包含,返回第一次出現的位置,否則返回-1;
str1.index(str2)
,若包含,返回第一次出現的位置,否則丟擲異常valueerror: substring not found
。
為簡單起見,才用字串庫函式find()
完成本題。
# 判斷兩個字串是否互為旋轉詞
defrotate_word
(a, b)
:if a is
none
or b is
none
orlen
(a)==
0and
len(b)==0
orlen
(a)!=
len(b)
:return
false
rotate_str = b + b
if rotate_str.find(a)!=-
1:# kmp演算法,採用字串庫函式find()
return
true
else
:return
false
# 簡單測試
if __name__ ==
'__main__'
: a =
"cdab"
b ="abcd"
print
(rotate_word(a, b)
)# true
a ="1ab2"
b ="ab12"
print
(rotate_word(a, b)
)# false
a ="2ab1"
b ="ab12"
print
(rotate_word(a, b)
)# true
判斷兩個字串是否互為旋轉詞
from 牛客 旋轉詞的定義為兩個字串組成字元相同,只是字元排序不同。比如字串abcd旋轉詞為bcda,cdab,dabc三個。以下為兩個實現方法。兩種實現方法的思考的關鍵點都是如何獲取旋轉詞。首先找旋轉詞的特點,是原字串的首個字元放在最後不斷形成的,所以如果將兩個原字串拼在一起,就可以發現所有旋轉...
判斷兩個字串是否互為旋轉詞 Python版
題目 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 fals...
字串問題 判斷兩個字串是否互為旋轉詞
如果乙個字串str,把字串str前面的任意部分挪到後面形成的字串叫做str的旋轉詞。給定兩個字串,判斷是否互為旋轉詞。比如 a abcd b cdab true a abcd b bcad false 解題思路 如果長度不一樣,肯定是false,如果長度一樣,時間複雜度是o n 方法一 直接利用st...