LeetCode 344 反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
s
的形式给出。不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]
思路及代码
-
暴力法,但复杂度过高
-
库函数
-
双指针,对称交换字母
class Solution(object): def reverseString(self, s): """ :type s: List[str] :rtype: None Do not return anything, modify s in-place instead. """ left, right = 0, len(s) - 1 while left < right: s[left], s[right] = s[right], s[left] left += 1 right -= 1
其他方法版本:
# 使用栈 def reverseString(self, s: List[str]) -> None: stack = [] for char in s: stack.append(char) for i in range(len(s)): s[i] = stack.pop() # 使用range def reverseString(self, s: List[str]) -> None: n = len(s) for i in range(n // 2): s[i], s[n - i - 1] = s[n - i - 1], s[i] #使用切片 def reverseString(self, s: List[str]) -> None: s[:] = s[::-1]
LeetCode 541 反转字符串II
题目描述:
给定一个字符串
s
和一个整数k
,从字符串开头算起,每计数至2k
个字符,就反转这2k
字符中的前k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。- 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。输入:s = "abcdefg", k = 2 输出:"bacdfeg"
代码
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
p = 0
while p < len(s):
p2 = p + k
s = s[:p] + s[p:p2][::-1] + s[p2:]
p += 2 * k
return s
LeetCode 151 反转字符串中的单词
题目描述:
给你一个字符串
s
,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。
s
中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。**注意:**输入字符串
s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。输入:s = "the sky is blue" 输出:"blue is sky the"
思路代码
首先是要去掉空格。去掉收尾空格可用 .strip() 函数,去除中间的空格用 .split() 函数。注意 .split(’ ‘) 只能去除一个空格,若多个空格连着出现只会去除一个。最后是转成列表后翻转。只用 .split()也可以去除首位的空格。
class Solution(object):
def reverseWords(self, s):
"""
:type s: str
:rtype: str
"""
s = list(s.strip().split())
print(s)
left, right = 0, len(s) - 1
while left < right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return ' '.join(s)
总结
- 字符串的很多操作和列表有关系,因此双指针法在此仍经常有用
- 感觉切片法在处理一些字符串问题上很简洁