代码随想录算法训练营Day8 | 151. 反转字符串中的单词,Kama55. 右旋字符串,28. 找出字符串中第一个匹配项的下标,459. 重复的子字符串

目录

151. 反转字符串中的单词

Kama55. 右旋字符串

28. 找出字符串中第一个匹配项的下标

459. 重复的子字符串


151. 反转字符串中的单词

题目链接:151. 反转字符串中的单词 - 力扣(LeetCode)

文章讲解:代码随想录

解题卡点:运行速度较慢

        解题思路:移除多余空格;将整个字符串反转;将每个单词反转。由于python不能原位修改字符串,故后两个步骤可以合并。

        另外,若能对字符串进行修改,使用双指针法移除空格,实现原地修改效果。类似于27. 移除元素。

        提升运行速度的点:

        ①对原字符串加空格,可以统一识别单词结束,不需要额外判断;

        ②最后使用' '.join加空格,若在单词加入列表时加空格,反转列表后要额外对空格进行操作;

        ③将word作为字符串格式而不是列表格式,省略了格式转换的时间。

class Solution:
    def reverseWords(self, s: str) -> str:
        s += ' ' # 对原字符串加空格,便于识别到单词结束
        sentence = []
        word = ''
        for idx in range(len(s)):
            if s[idx].isalnum(): # 如果字符串中当前元素是字母或数字
                word += s[idx] # 该元素添加到单词中
                if not s[idx+1].isalnum(): # 如果该元素下一个是空格,代表单词结束
                    sentence.append(word) # 将单词添加到列表中
                    word = '' # 重置单词
        sentence.reverse() # 迭代后列表中只有单词,没有空格,将其反转
        return(' '.join(sentence))

    # 时间复杂度 O(n)
    # 空间复杂度 O(n)

Kama55. 右旋字符串

题目链接:55. 右旋字符串(第八期模拟笔试)

文章讲解:右旋字符串 | 代码随想录

解题卡点:对python来说好像太简单?

        若可以修改字符串,则空间复杂度可为O(1),实现原地修改效果。

        方法如下:

def main():
    k = int(input())
    s = input()
    print(s[-k: ] + s[:-k])
    
if __name__ == '__main__':
    main()

    # 时间复杂度 O(n)
    # 空间复杂度 O(n)

28. 找出字符串中第一个匹配项的下标

题目链接:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

文章讲解:代码随想录

解题卡点:难以理解KMP算法

        理解思路:

        ①帮你把KMP算法学个通透!(理论篇)_哔哩哔哩_bilibili

        KMP算法关键在于:在当前对文本串和模式串检索的过程中,若出现了不匹配,如何充分利用已经匹配的部分。匹配到不正确的地方以前的子模式串跟上面的子文本串相等,所以子模式串的最长前缀,跟文本串的相同最长后缀有匹配,故从该已匹配部分继续进行元素对比。

        ②KMP算法的前缀next数组最通俗的解释,如果看不懂我也没辙了_kmpnext数组通俗解法-优快云博客

        理解next数组


459. 重复的子字符串

题目链接:459. 重复的子字符串 - 力扣(LeetCode)

文章讲解:代码随想录

解题卡点:难以理解KMP算法

        暂时跳过,二刷再来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值