字符串左旋转(Left Rotation)是将字符串中的字符向左移动指定的位数,并将移出的字符添加到字符串的末尾。例如,对于字符串 "abcdefg"
和旋转数 2
,左旋转后的结果是 "cdefgab"
。
实现方法
1. 基于切片的实现
使用字符串切片是实现左旋转的简洁方法。
def left_rotate(s, n):
# 处理边界情况
if not s or n <= 0:
return s
n = n % len(s) # 处理旋转次数大于字符串长度的情况
return s[n:] + s[:n]
# 使用示例
s = "abcdefg"
n = 2
print(left_rotate(s, n)) # 输出: "cdefgab"
2. 使用队列
可以使用collections.deque
来实现左旋转。deque
提供了高效的旋转操作。
from collections import deque
def left_rotate(s, n):
d = deque(s)
d.rotate(-n) # 左旋转
return ''.join(d)
# 使用示例
s = "abcdefg"
n = 2
print(left_rotate(s, n)) # 输出: "cdefgab"
解释
-
基于切片:
s[n:]
表示从第n
个字符到末尾的子字符串。s[:n]
表示从开头到第n
个字符(不包括第n
个字符)的子字符串。- 将这两个子字符串拼接在一起即可完成左旋转。
-
使用
deque
:deque.rotate(-n)
将deque
中的元素左旋转n
位。负号表示向左旋转,正号表示向右旋转。''.join(d)
将旋转后的deque
转换回字符串。
处理边界情况
- 当旋转位数
n
大于字符串长度时,使用n % len(s)
确保旋转次数在合理范围内。 - 旋转次数为0或负值时(如
n <= 0
),直接返回原字符串。
时间复杂度
- 基于切片的实现:
O(m)
,其中m
是字符串的长度,因为切片和拼接操作的时间复杂度都是线性的。 - 使用
deque
:O(m)
,deque.rotate
和''.join
操作都是线性的。
这些方法适用于各种需要字符串旋转的场景,选择最适合的方法可以帮助提高代码的简洁性和效率。