344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组
char[]
的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)
的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
思路
使用双指针来交换字母
代码
双指针
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
l, r = 0, len(s) - 1
while l <= r:
s[l], s[r] = s[r], s[l]
l += 1
r -= 1
Range
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
n = len(s)
for i in range(n // 2):
s[i], s[n - 1 - i] = s[n - 1 - i], s[i]
复杂度分析
- 时间复杂度:
O(n)
- 空间复杂度:
O(1)
541. 反转字符串 II
给定一个字符串
s
和一个整数k
,从字符串开头算起, 每计数至2k
个字符,就反转这2k
个字符中的前k
个字符。
如果剩余字符少于k
个,则将剩余字符全部反转。
如果剩余字符小于2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
思路
遍历子串的时候每次移动2 * k
。而且可以利用python的slicing,假设s = 'abcde'
, s[40:]
会return ''
,空字符串,因为40
超过了字符串的长度。
代码
class Solution:
def reverseStr(self, s: str, k: int) -> str:
for cur in range(0, len(s), 2 * k):
s = s[:cur] + s[cur:(cur+k)][::-1] + s[(cur+k):]
return s
复杂度分析
- 时间复杂度:
O(n)
- 空间复杂度:
O(1)
替换空格
请实现一个函数,把字符串
s
中的每个空格替换成%20
。
思路
在Python里面,字符串是不可变类型,所以操作字符串需要将其转换为列表,因此空间复杂度不能为O(1)
。
代码
class Solution:
def replaceSpace(self, s: str) -> str:
return "%20".join(s.split(" "))
join 用于字符串。
class Solution:
def replaceSpace(self, s: str) -> str:
return s.replace(' ', '%20')
class Solution:
def replaceSpace(self, s: str) -> str:
s = list(s)
for ind, val in enumerate(s):
if val == " ":
s[ind] = "%20"
return "".join(s)
复杂度分析
- 时间复杂度:
O(n)
- 空间复杂度:
O(n)
151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词
思路
python里面有一些针对字符串的方法。strip(), split(). 组合使用.
代码
class Solution:
def reverseWords(self, s: str) -> str:
s = s.strip()
s = s[::-1]
return " ".join(word[::-1] for word in s.split())
复杂度分析
- 时间复杂度:
O(n)
- 空间复杂度:
O(n)
??不是很清楚
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串
"abcdefg"
和数字2
,该函数将返回左旋转两位得到的结果"cdefgab"
。
思路
- 反转前半部分
- 反转后半部分
- 反转全部
这样子操作不需要用到substring, 所以空间复杂度为O(1)
。但是python中的string属于不可变类型,所以本质上我们也只能新建一个list来反转,或者用slicing。空间复杂度还是O(n)
.
代码
写法一:substring
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
return s[n:] + s[:n]
写法二:3反转
class Solution:
def reverseLeftWords(self, s: str, n: int) -> str:
s = list(s)
s[:n] = reversed(s[:n])
s[n:] = reversed(s[n:])
s = reversed(s)
return "".join(s)
复杂度分析
- 时间复杂度:
O(n)
- 空间复杂度:
O(n)