首页 > 编程语言 >代码随想录算法训练营Day9 | 字符串 151.翻转字符串单词 28.实现strStr() KMP算法介绍

代码随想录算法训练营Day9 | 字符串 151.翻转字符串单词 28.实现strStr() KMP算法介绍

时间:2024-07-01 19:58:38浏览次数:17  
标签:needle 随想录 len next 算法 str 字符串 haystack

python中常用:

        s[::-1] : 反转整个字符

        s.strip() :删除开头或结尾处的空白字符

        s.split() :字符拆分成单词  → list

        “ ”.join(s):list → 字符串

      (持续更新…)

 151.翻转字符串里的单词

  题目: Leetcode151 翻转字符串里的单词 

  给定一个字符串,逐个翻转字符串中的每个单词。

 

    方法:

   ① 解题思路:先删除多余空白; 反转整个字符串;将每个单词反转 

class Solution:
    def reverseWords(self, s: str) -> str:
        # 删除前后空白
        s = s.strip()
        # 反转整个字符串
        s = s[::-1]
        # 将字符串拆分为单词,并反转每个单词
        s = ' '.join(word[::-1] for word in s.split())
        return s

   ② 使用双指针:

class Solution:
    def reverseWords(self, s: str) -> str:
        # 将字符串拆分为单词,即转换成列表类型
        words = s.split()

        # 反转单词
        left, right = 0, len(words) - 1
        while left < right:
            words[left], words[right] = words[right], words[left]
            left += 1
            right -= 1

        # 将列表转换成字符串
        return " ".join(words)

 

28. 实现strStr( )

题目:LeetCode28 实现strStr()    经典KMP算法

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

 方法:①前缀表法 ②暴力法

  ①前缀表法

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: str, needle: str) -> int:
        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

  ②暴力法

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        m, n = len(haystack), len(needle)
        for i in range(m):
            if haystack[i:i+n] == needle:
                return i
        return -1  

KMP算法介绍:

① 由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。

② 主要应用在字符串匹配查找上

③ 主要思想当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

④ 前缀表(prefix table):next数组,是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。起始位置到下标i之前(包括i)的子串中,有多大长度的相同前缀后缀。

字符串总结

字符串问题常用双指针法、KMP算法。

标签:needle,随想录,len,next,算法,str,字符串,haystack
From: https://blog.csdn.net/weixin_65053787/article/details/140104411

相关文章

  • Open3D 点云快速全局配准FGR算法(粗配准)
    目录一、概述1.1原理和步骤1.2关键技术和优势1.3应用场景二、代码实现2.1关键代码2.1.1.函数:execute_fast_global_registration2.1.2调用registration_fgr_based_on_feature_matching函数2.2完整代码三、实现效果3.1原始点云3.2粗配准后点云一、概述    ......
  • 研0 冲刺算法竞赛 day8 P1303 A*B Problem
    思路:用char[]存储输入,后用int[]逐位计算,根据乘法计算规则错位相加,用数组存储,然后考虑进位,最后倒序输出代码:#include<iostream>#include<cstring>usingnamespacestd;chara1[10001],b1[10001];inta[10001],b[10001],c[10001];intmain(){ cin>>a1>>b1; for......
  • Day61 代码随想录打卡|回溯算法篇---组合优化
    本篇是针对上一题的优化,因为在计算所有可能的组合结果时,不是每一条路径都是我们需要遍历的,如图,当n和k都为4的时候,其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边,而是只需要沿着1,2,3,4的路径直接下来即可。那么我们怎么控制循环变量使得......
  • 隐语实训09-SML入门基于SPU迁移机器学习算法实践
    一、32位浮点数32位浮点数(SinglePrecisionFloatingPoint)是一种用于表示实数的标准格式,由IEEE754标准定义。表示方法32位浮点数由三部分组成:符号位(S):1位,表示数值的正负。指数位(E):8位,用于表示数值的范围。尾数位(M):23位,表示有效数字。其表示公式为:......
  • 算法题常见模板
    数据结构类数组(Array)双指针(TwoPointers)滑动窗口(SlidingWindow)前缀和(PrefixSum)链表(LinkedList)单链表反转(ReverseLinkedList)链表合并(MergeLinkedLists)链表环检测(CycleDetection)栈和队列(StackandQueue)栈的基本操作(Basi......
  • 代码随想录算法训练营第四十三天 | 52.携带研究材料 518.零钱总和II 377.组合总和IV 7
    完全背包有N件物品和一个最多能被重量为W的背包,第i间物品的重量为weights[i],价值为value[i],每件物品都有无限个,求解将哪些物品装入背包里,物品价值总和最大遍历顺序:纯完全背包问题(即求装满背包后的最大价值)先遍历背包先遍历物品都是可以的和零一背包求解的最大不同就是遍历顺序......
  • 【算法炼金术】让数字起舞:两数相加的C++艺术
    【算法炼金术】让数字起舞:两数相加的C++艺术一、引言:编织数字的魔法二、技术概述:数字的交响乐章技术定义核心特性代码示例:原味经典三、技术细节:数字的幕后故事原理解析难点剖析四、实战应用:数字的舞台秀应用场景问题与解决方案问题:大数相加易溢出五、优化与改进:数字......
  • 【算法探秘】无重复字符的最长子串:解锁字符串中的独特风景
    【算法探秘】无重复字符的最长子串:解锁字符串中的独特风景一、引言:在字符的海洋中航行二、技术概述:独步字符森林技术定义核心特性代码示例:初尝甜蜜果实三、技术细节:拨开迷雾,洞悉本质原理解析难点剖析四、实战应用:字节跳跃,解密信息应用场景案例展示五、优化与改进:精益......
  • 【算法探险】在排序数组中查找元素的第一个和最后一个位置
    【算法探险】在排序数组中查找元素的第一个和最后一个位置一、引言:算法界的寻宝图二、技术概述:双剑合璧,左右逢源定义与核心特性优势代码示例:初露锋芒三、技术细节:抽丝剥茧,揭秘算法奥秘原理解析难点剖析四、实战应用:数字海洋,定位精准应用场景案例展示五、优化与改进:精......
  • 【算法】搜索插入位置:C++ 实现与深入理解
    【算法】搜索插入位置:C++实现与深入理解一、引言:C++算法的精髓与探索之旅二、技术概述:有序数组的探索定义与技术介绍核心特性和优势代码示例三、技术细节:二分查找的奥秘原理解析难点分析四、实战应用:排序数组的高效操作应用场景问题与解决方案五、优化与改进潜在问题......