字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)
28. 实现 strStr()
strStr(haystack: str, needle: str)
的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 ;如果 needle 是空字符串,则返回 0。 Python 中对应的写法是 haystack.find(needle)
。
如果让我们自己实现这个函数,最简单的思路就是对 haystack 字符串中每个字符的位置,都用 needle 字符串试着去匹配,这样的最坏时间复杂度是 O(n * m)。KMP 算法的思路是对 needle 字符串(即模式字符串)进行预处理,用一个 Next 数组(前缀表)记录下每个字符位置作为最后一个字符时,前后缀字符串相等的最大长度。当出现一个不匹配字符时,(needle 字符串中)它的前面如果有相同的前缀和后缀,则 needle 字符串可以跳到 haystack 字符串中对应后缀的位置开始匹配,而不是 haystack 字符串中后一位的位置。
class Solution:def strStr(self, haystack: str, needle: str) -> int:if not needle:return 0n, m = len(haystack), len(needle)Next = self.generateNext(needle)j = 0for i in range(n):while haystack[i] != needle[j] and j > 0:j = Next[j - 1]if haystack[i] == needle[j]:j += 1if j == m:return i - j + 1return -1def generateNext(self, needle: str):m = len(needle)Next = [0 for _ in range(m)]left = 0for right in range(1, m):while needle[left] != needle[right] and left > 0:left = Next[left - 1]if needle[left] == needle[right]:left += 1Next[right] = leftreturn Next
459. 重复的子字符串
class Solution:def repeatedSubstringPattern(self, s: str) -> bool:size = len(s)if size == 0:return FalseNext = self.generateNext(s)if Next[size - 1] != 0 and size % (size - Next[size - 1]) == 0:return Truereturn Falsedef generateNext(self, p: str):m = len(p)Next = [0 for _ in range(m)]left = 0for right in range(1, m):while p[left] != p[right] and left > 0:left = Next[left - 1]if p[left] == p[right]:left += 1Next[right] = leftreturn Next
把整个字符串(长度为 size)当作是 KMP 算法中的模式串(needle),对其生成 Next 数组。如果字符串是由 n 个重复子串构成的,则 Next [size - 1] 一定是记录了 n - 1 个子串的长度,即最长的相同前后缀长度为 n - 1 个子串长度。这样 (size - Next[size - 1]) 就是单个子串的长度,如果 size % (size - Next[size - 1]) == 0,就说明这个字符串是由多个重复子串构成的。
字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)相关推荐
- 二分查找基础概念与经典题目(Leetcode题解-Python语言)二分索引型
二分查找的定义如下(引自Wiki): 在计算机科学中,二分查找算法(英语:binary search algorithm),也称折半搜索算法(英语:half-interval search algor ...
- 字符串经典题目(Leetcode题解-Python语言)
344. 反转字符串 class Solution:def reverseString(self, s: List[str]) -> None:"""Do not ...
- 链表基础概念与经典题目(Leetcode题解-Python语言)
所谓链表,就是由链节点元素组成的表,那什么是链节点呢?直接上定义: class ListNode:def __init__(self, val=0, next=None):self.val = val ...
- 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用
上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...
- 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)
二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...
- 队列的基础概念与经典题目(Leetcode题解-Python语言)
队列是先入先出(后入后出)的数据结构,常用操作就 push 和 popleft,Python中用列表中的 pop(0) 或者 collection.deque的 popleft() 都可以. 普通队列 ...
- 栈的基础概念与经典题目(Leetcode题解-Python语言)
栈是先入后出(后入先出)的数据结构,常用操作就 push 和 pop,Python中用列表实现即可,基本概念可以看Leetbook相关章节. 普通栈 232. 用栈实现队列 class MyQueue ...
- 快速幂算法相关题目(Leetcode题解-Python语言)
50. Pow(x, n) 快速幂算法的目的,就是快速计算 x 的 n 次方.基本思路是把 n 视作二进制数,则 n 可以被分解为多个 2 的幂次方之和,如 12 对应 1100 等于 0∗20+0∗ ...
- 高度平衡的二叉搜索树基础概念与经典题目(Leetcode题解-Python语言)
高度平衡的二叉搜索树(平衡二叉树),定义见此Leetbook.简单来说,就是基于相同节点值构建出来的二叉搜索树中高度最小的,即为平衡二叉树(不唯一).有 N 个节点的平衡二叉搜索树,它的高度是 log ...
最新文章
- Node.js + Nginx-现在怎么办?
- C++智能指针详解【C++智能指针】
- 千位分隔符的完整攻略
- dubbo实现原理之SPI简介
- python代码技巧_让你python代码更快的3个小技巧
- BAT 为首的中国互联网公司为何陷入技术焦虑的怪圈?
- RCE 0day影响数万台QNAP SOHO NAS 设备
- 带壳破解SMC补丁技术
- 【Ubuntu20.04+ROS Noetic】ROS解决BUG日志【一】
- DCEP即将破茧成蝶,数字货币新革命来了
- 中国废弃电器电子产品回收处理行业发展格局与投资风险可行性报告2022~2027年
- 翻倍增长!C-V2X商业化“提速”,新一代模组加速“助跑”
- 找不到DNS地址怎么办?
- 使用 ESP32 设计智能手表第 3 部分 - 磁力计和陀螺仪
- 网络:简述对5G网络切片的认识
- python 廖雪峰_实战 - 廖雪峰的官方网站
- 关闭笔记本自带的键盘
- 前端vue项目(使用pdf.js) pdf展示及pdf工具栏放大缩小功能实现
- Java数据结构:有序优先队列
- 哈理工oj 1073 病毒
热门文章
- 单元测试01:nunit 安装与代码测试
- PHP 分布式集群中session共享问题以及session有效期的设置
- C和指针之结构体大小和成员变量位置距离结构开始存储的位置偏移字节
- C和指针之Eratosthenes-埃拉托斯特尼筛方法找质数
- Android之调用系统分享
- 使用VS开发C++ 控制台程序或其他项目出现 ‘ LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib” ’ 常规解决办法
- 【C语言简单说】十三:变量的生命周期
- python路径怎么找windows_如何查看 windows 中 Python安装路径
- 电子商务应用课程知识整理 第一章-电子商务概述与类型
- 不固定图片宽高瀑布流_APP设计学习:瀑布流式的产品UI设计