字符串轮转。给定两个字符串
s1
和s2
,请编写代码检查s2
是否为s1
旋转而成(比如,waterbottle
是erbottlewat
旋转后的字符串)。

思路:如果是旋转而来的,将s1和s2相连肯定会存在A+B+B+A的情况
python3实现:
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
# 去除特殊情况
if s1 == s2:
return True
# 直接将两个字符串加载一起,如果是旋转成的
# 自然就会有:A + B + B + A
# 的这种形式
s3 = s1 + s2
# 把s3从中间分开
len_s3 = len(s3)
mid_s3 = int(len(s3) / 2)
s3_left = s3[:mid_s3]
s3_right = s3[mid_s3:]
p = 0
while p <= len(s3_left) - 1:
if s3_left[p:] in s3_right:
if s3_left[:p] == s3_right[-p:] and s3_left[p:] == s3_right[:len(s3_right)-p]:
return True
p += 1
return False

没想到会用时这么久,本意是为了用“if s3_left[p:] in s3_right:”降低时间没想到这道题不需要
删掉再试一次
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
# 去除特殊情况
if s1 == s2:
return True
# 直接将两个字符串加载一起,如果是旋转成的
# 自然就会有:A + B + B + A
# 的这种形式
s3 = s1 + s2
# 把s3从中间分开
len_s3 = len(s3)
mid_s3 = int(len(s3) / 2)
s3_left = s3[:mid_s3]
s3_right = s3[mid_s3:]
p = 0
while p <= len(s3_left) - 1:
if s3_left[:p] == s3_right[-p:] and s3_left[p:] == s3_right[:len(s3_right)-p]:
return True
p += 1
return False

时间是降低了,但是还是太慢了,换一种思路,如果直接将s2二倍化,减去s1,应该还是等于s2
class Solution:
def isFlipedString(self, s1: str, s2: str) -> bool:
# 去异
if len(s1) != len(s2):
return False
dic_s1 = collections.Counter(s1)
dic_s2 = collections.Counter(s2)
if dic_s1 != dic_s2:
return False
else:
# 比较顺序,将S2乘以2,减去S1,应该刚好等于S2
new_s2 = s2 + s2
if s1 in new_s2:
idx_start = new_s2.index(s1)
idx_end = idx_start + len(s1)
target = new_s2[:idx_start] + new_s2[idx_end:]
if target == s2:
return True
else:
return False
else:
return False

差不多了,溜了溜了~