344. 反转字符串
题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/reverse-string
题目
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[]
的形式给出。
不要给另外的数组分配额外的空间,你必须 原地 修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
解题思路
思路:双指针
如若单纯为了达到 反转字符串 的目的,对于 Python 而言,这道题直接调用内置函数 reverse() 就能够得到结果,但这并不是此题的本意。
先看看本题中的要求及限制。
要求:
- 编写函数,将输入的字符串反转过来。其中给定的字符串以字符数组的形式给出。
限制:
- 不能分配额外的空间,使用 O ( 1 ) O(1) O(1) 的空间,原地修改输入数组。
在这里,我们可以使用双指针的方法。两个指针中其中一个从左往右遍历,另外一个从右往左遍历,遍历的同时交换字符。
具体的做法如下:
- 定义双指针 left、right。left 指向数组头部,right 指向数组尾部;
- 交换字符,同时将 left 往右移动一个位置,将 right 往左移动一个位置;
- 重复第二个步骤,直至 left、right 指针重合。
这里额外提下,在第二个步骤中,如若非严格需要交换,即是当遇到 left、right 指针指向的元素相同时,不进行交换只移动指针。
不过,下面的代码,严格按照位置交换。
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
# 定义指针
left = 0
right = len(s) - 1
# left、right 指针重合前,遍历数组,交换字符
while left < right:
# 交换字符
s[left], s[right] = s[right], s[left]
# 移动指针
left += 1
right -= 1
复杂度分析
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 为字符数组的长度。其中交换了 n / 2 n/2 n/2 次。
- 空间复杂度: O ( 1 ) O(1) O(1)。只使用了常数空间。
欢迎关注
公众号 【书所集录】
如有错误,烦请指出,欢迎指点交流