返回
从LeetCode541学字符串反转技巧,开拓算法视野
前端
2024-01-06 02:33:04
各位程序员伙伴们,这是我在11月更文挑战中的第20天,活动详情请查看:2021 最后一次更文挑战。今天我们来一道字符串相关的题目,不过感觉更像是一道数组处理的题目,不知道是不是我的理解有问题。让我们一起来看看题目吧!
LeetCode 541 题目介绍
给你一个字符串和一个整数 k
,你需要反转字符串中从位置 k
开始的每个连续的 k
个字符。
如果剩余字符少于 k
个,则将它们反转。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 104
s
由小写英文字母组成1 <= k <= 104
解题思路
这道题可以分为两个步骤来解决:
- 遍历字符串,每
k
个字符一组,将每组字符反转。 - 如果剩余字符少于
k
个,则将剩余字符反转。
为了提高效率,我们可以使用双指针法来实现第一个步骤。具体步骤如下:
- 定义两个指针
left
和right
,分别指向要反转的子字符串的开头和结尾。 - 将
left
指向字符串的第一个字符,并将right
指向字符串的第k
个字符。 - 将子字符串从
left
到right
反转。 - 将
left
指向子字符串的下一个字符,并将right
指向子字符串的下一个k
个字符。 - 重复步骤 3 和 4,直到
right
指向字符串的末尾。
如果剩余字符少于 k
个,则我们可以使用以下步骤将剩余字符反转:
- 将
left
指向字符串的第一个字符,并将right
指向字符串的最后一个字符。 - 将子字符串从
left
到right
反转。
代码实现
def reverse_str(s, k):
"""
反转字符串中从位置 k 开始的每个连续的 k 个字符。
如果剩余字符少于 k 个,则将它们反转。
Args:
s (str): 字符串
k (int): 反转的长度
Returns:
str: 反转后的字符串
"""
# 定义双指针
left = 0
right = k
# 遍历字符串
while right <= len(s):
# 反转子字符串
s = s[:left] + s[left:right][::-1] + s[right:]
# 更新指针
left += k
right += k
# 如果剩余字符少于 k 个,则将剩余字符反转
if left < len(s):
s = s[:left] + s[left:][::-1]
return s
# 测试代码
s = "abcdefg"
k = 2
print(reverse_str(s, k)) # "bacdfeg"
s = "abcd"
k = 2
print(reverse_str(s, k)) # "bacd"
总结
通过这道题,我们可以学习到如何使用双指针法来高效地反转字符串。这道题也让我们了解到,即使是简单的字符串处理问题,也可能存在一些巧妙的解法。希望大家能够通过这道题学到一些有用的技巧。