代码随想录算法训练营第九天| 151.翻转字符串里的单词 右旋字符串 28. 实现 strStr() 459.重复的子字符串

代码随想录题解

151.翻转字符串里的单词

力扣151翻转字符串里的单词

这个题不难,但是我搞了一会,主要是.split()函数不熟悉,代码如下所示

class Solution:
    def reverseWords(self, s: str) -> str:
        arr = s.split()
        arr.reverse()
        return " ".join(arr)

右旋字符串

卡码网题目


k = int(input())
s = input()
s = s[len(s)-k:] + s[:len(s)-k]# 1.获取从倒数第 k 个字符到最后的所有字符。2. 获取从第一个字符到倒数第 k+1 个字符的所有字符。
print(s)

这道题python做起来可以直接用列表切片来做,但是要很熟练才行,重点在于:

代码中的这两行是对字符串 s 进行切片操作,并将两部分重新组合起来以达到反转字符串的效果:

  1. s[len(s)-k:] 获取从倒数第 k 个字符到最后的所有字符。
  2. s[:len(s)-k] 获取从第一个字符到倒数第 k+1 个字符的所有字符。

之后,将这两部分连接起来形成一个新的字符串。

这里的关键在于理解 Python 中的切片语法。对于一个序列 x[start:stop],如果省略了 start,那么默认从序列的开始位置取值;如果省略了 stop,则一直取到序列的末尾。

28. 实现 strStr()

力扣28

这道题是KMP算法,KMP算法当时自学的时候很难搞懂,只知道是查找子串的一个算法,这回也没太搞懂多少直接就用了……
 

class Solution:
    def getNext(self, next, s):
        j = -1
        next[0] = j
        for i in range(1, len(s)):
            while j >= 0 and s[i] != s[j+1]:
                j = next[j]
            if s[i] == s[j+1]:
                j += 1
            next[i] = j
    
    def strStr(self, haystack, needle):
        if not needle:
            return 0
        next = [0] * len(needle)
        self.getNext(next, needle)
        j = -1
        for i in range(len(haystack)):
            while j >= 0 and haystack[i] != needle[j+1]:
                j = next[j]
            if haystack[i] == needle[j+1]:
                j += 1
            if j == len(needle) - 1:
                return i - len(needle) + 1
        return -1

459.重复的子字符串

力扣459

class Solution(object):
    def repeatedSubstringPattern(self, s):
        n = len(s)
        if n <= 1:
            return False
        ss = s[1:] + s[:-1] 
        return ss.find(s) != -1

我决定代码要实用主义了,能跑起来就行,最近太忙没空学KMP算法,只能先搞懂这几个切片操作了:

  • s[1:] 表示从 s 的第二个字符到最后一个字符的子串。
  • s[:-1] 表示从 s 的第一个字符到倒数第二个字符的子串。

然后将这两部分拼接在一起形成 ss。这样做的目的是为了创建一个循环版本的 s,使得开头和结尾相邻,可以检测是否有重复的模式。

判断 s 是否存在于 ss 中。如果 s 存在于 ss 中且不是 -1,则说明 s 可能是由一个更短的子串重复组成的,返回 True;否则返回 False

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值