今天开始系统学习字符串的知识。字符串其实也是一个iterable的类型,因此可以用for循环便遍历,在具体的问题里有很多种具体做法。
344.反转字符串
这道题很简单,关键是思路要设置好。
我用的是最简单的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):
temp = s[i]
s[i] = s[n-i-1]
s [n-i-1] = temp
除此之外还可以用双指针、栈(压入并pop出)、用reversed函数、切片、列表推导。感觉列表推导方法比较有意思:
class Solution:
def reverseString(self, s: List[str]) -> None:
"""
Do not return anything, modify s in-place instead.
"""
s[:] = [s[i] for i in range(len(s)-1, -1, -1)]
这种方法要注意的是range里面的结尾是-1而不是0,因为range是左闭右开的。
541. 反转字符串2
这道题也是自己做出来的!!!开心耶耶耶耶耶耶
自己的方法是这么写的:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
n = len(s)
left = 0
while (left + k) < n:
for i in range(k//2):
temp = s[left + (k - i - 1)]
s[left + (k - i - 1)] = s[left + i]
s[left + i] = temp
left = left + 2*k
if left < n:
s[left:n] = [s[i] for i in range(n-1, left-1, -1)]
return "".join(s)
还有一个方法也很不错,避免了大量的逻辑运算:
class Solution:
def reverseStr(self, s: str, k: int) -> str:
p = 0
while p<len(s):
p2 = p+k
s = s[:p] + s[p:p2][::-1] + s[p2:]
p = p + 2*k
return s
直接利用字符串的性质来进行反转,同时考虑剩下元素个数在k个以内等三种情况。还有个好处是不用把s变成list,整体都很不错!!
05. 替换空格
这道题的做法很多。题解里的双指针方法主要是针对别的语言的数据结构里字符串可以更改的情况,但是在python中字符串不可更改,所以其实没有省略空间,只是一种思路而已。
双指针法,要注意的是[]的索引是左闭右开的:
class Solution:
def replaceSpace(self, s: str) -> str:
count = 0
for i in s:
if i == ' ':
count += 1
res = list(s)
res.extend([' '] * count * 2)
left, right = len(s) - 1, len(res) - 1
while left >= 0:
if res[left] == ' ':
res[right-2:right+1] = list('%20')
right -= 3
else:
res[right] = res[left]
right -= 1
left -= 1
return ''.join(res)
使用切片法,好处是不用改list,需要注意的就是要从右往左遍历,不然就会出错:
class Solution:
def replaceSpace(self, s: str) -> str:
for i in range(len(s)-1, -1, -1):
if s[i] == " ":
s = s[:i] + "%20" + s[i+1:]
return s
还有一些python的语法糖:
class Solution:
def replaceSpace(self, s: str) -> str:
return "%20".join(s.split(" "))
或者
class Solution:
def replaceSpace(self, s: str) -> str:
return s.replace(' ', '%20')
151. 反转字符串中的单词
这道题还蛮简单的,关键是需要注意.split()就可以自动抹去所有的空格,这个很重要,会使得整道题方便很多。
class Solution:
def reverseWords(self, s: str) -> str:
res = s.split()
for i in range(len(res)//2):
temp = res[i]
res[i] = res[len(res) - i - 1]
res[len(res) - i - 1] = temp
result = ' '.join(res)
return result
用双指针完成也可以
class Solution:
def reverseWords(self, s: str) -> str:
s = s.split()
left, right = 0, len(s)-1
while left<right:
s[left], s[right] = s[right], s[left]
left += 1
right -= 1
return ' '.join(s)
最后还剩两道KMP的题,有点难呜呜呜,留到二刷!!!