代码随想录|字符串题目集合

今天开始系统学习字符串的知识。字符串其实也是一个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的题,有点难呜呜呜,留到二刷!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值