首页 > 编程语言 >代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串

代码随想录算法训练营第九天|28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串

时间:2023-05-18 13:47:04浏览次数:51  
标签:第九天 return 前缀 needle 随想录 len next 字符串

【参考链接】

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

【注意】

1.kmp解决的就是字符串匹配的问题。

2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。---前缀表

3.找到一个子字符串里它的最长相等前后缀。

4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不包含首字母的所有子串。

5.eg.aabaaf:前缀表是010120----next数组(遇见冲突,向前回退找的方式不一样)。

6.n为文本串长度,m为模式串长度,时间复杂度是O(n+m)的。

 

【代码】

实现步骤:

1.初始化。

2.前后缀不相同。

3.前后缀相同。

4.next

i后缀末尾,j前缀末尾。 i包括i之前这个子串的最长相等先后缀。

next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度。

 1 class Solution(object):
 2     def strStr(self, haystack, needle):
 3         """
 4         :type haystack: str
 5         :type needle: str
 6         :rtype: int
 7         """
 8         #前缀表不减一
 9         if len(needle) == 0:
10             return 0
11         
12         next = self.getNext(needle) #前缀表
13         j = 0
14 
15         for i in range(len(haystack)):
16             while j>0 and haystack[i] != needle[j]:
17                 j = next[j-1]
18             if haystack[i] == needle[j]:
19                 j += 1
20             if j == len(needle): #匹配成功,返回第一个匹配项的下标
21                 return i - len(needle) + 1 # 2-3+1=0  haystack = "sadbutsad", needle = "sad" 返回0
22         
23         return -1
24 
25     
26     def getNext(self, needle):
27         next = [0] * len(needle)
28         j = 0
29         next[0] = j
30 
31         for i in range(1,len(needle)):
32             while j > 0 and needle[i] != needle[j]:
33                 #不相等
34                 j = next[j-1] #回退
35             if needle[i] == needle[j]:
36                 #相等
37                 j += 1 #后缀首字母的前一位
38             next[i] = j
39 
40         return next

459. 重复的子字符串

【代码】

 1 class Solution(object):
 2     def repeatedSubstringPattern(self, s):
 3         """
 4         :type s: str
 5         :rtype: bool
 6         """
 7         #前缀表(不减一)的代码实现
 8         if len(s) == 0:
 9             return False
10         
11         next = [0] * len(s)
12         self.getNext(next, s)
13 
14         if next[-1] != 0 and len(s) %(len(s)-next[-1]) == 0:  #有前缀表
15             return True
16 
17         return False
18 
19     def getNext(self, next, s):
20         next[0] = 0
21         j = 0
22         for i in range(1, len(s)):
23             while j>0 and s[i] != s[j]:
24                 j = next[j-1]
25             if s[i] == s[j]:
26                 j += 1
27             next[i] = j
28 
29         return next

ps:记得之后总结。

标签:第九天,return,前缀,needle,随想录,len,next,字符串
From: https://www.cnblogs.com/wuyijia/p/17411109.html

相关文章

  • python之字符串和运算符
    python基本数据类型python之字符串和运算符字符串格式化字符串print(6+6)print('6'+'6')print('jerr'+'y')#print(6+'6')两个不同类型的相加会报一个类型错误1266jerry拼串s='hello'print('s='+s)用+号来进行拼串s=hello传递参数s=......
  • Java中的字符串
    目录一、简介二、字符串定义2.1直接定义字符串2.2通过使用String类的构造方法来创建字符串三、如何使用JavaAPI帮助文档3.1帮助文档下载地址3.2帮助文档使用3.2中文帮助文档四、String字符串和int、double、float的相互转换4.1String转int4.2String转Double、Flo......
  • Java字符串就是Unicode字符序列
    一、简介Java字符串就是Unicode字符序列。Java里没有内置的字符串类型,而是在标准的类库中提供了一个预定义类,String。每个用双引号""括起来的都是String类的一个实例。字符串是日常开发中最常用,Java字符串的一个重要特点就是字符串不可变二、字符串定义2.1直接定义字符串......
  • 25、java 中操作字符串都有哪些类?它们之间有什么区别?
    (1)StringString是不可变对象,每次对String类型的改变时都会生成一个新的对象。(2)StringBuilder线程不安全,效率高,多用于单线程。(3)StringBuffer线程安全,由于加锁的原因,效率不如StringBuilder,多用于多线程。不频繁的字符串操作使用String,操作频繁的情况不建议使用String。StringB......
  • 正确使用PHP开发系列:数组转字符串后,给每一项加上单引号
     $arr=array('a','b','c');echo"'".implode("','",$arr)."'";//outputs'a','b','c' 需要注意的是,implode的第一个参数,加上的双引号,如果是用在sql查询里,会自动加上转义符,即:......
  • C# 字符与字符串的增删改查
    4.1 字符类Char的使用1. Char类概述C#中的char数据类型:代表单个字符• char类型,BLC名称System.Char。• 取值范围对应Unicode字符集• 占两个字节2. Char类的使用tostring将此实例的值转换为其等效的字符串表示char类型可以隐式的转换到可以容纳无符号short类型的数值类型对于......
  • js字符串转数值
    1.转换函数:js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(NotaNumber)。一些示例如下:parseInt("1234blue");//returns1234parseInt("0xA");//ret......
  • 查找文本字符串,并返回所在行数据
    #include<iostream>#include<string>#include<Windows.h>#include<fstream>#include<sstream>#include<signal.h>#include<io.h>#include<vector>#include<process.h>#include<cstdio>#include<as......
  • 代码随想录算法训练营第8天 | ● 344.反转字符串 ● 541. 反转字符串II ● 剑指Offer
     第四章 字符串part01  今日任务  ●  344.反转字符串●  541. 反转字符串II●  剑指Offer 05.替换空格●  151.翻转字符串里的单词●  剑指Offer58-II.左旋转字符串  详细布置   344.反转字符串  建议: 本题是字符串基础题目,就是考察......
  • python字符串的45个内置方法
    1.字符串拼接和查找: 2.字符串分割替换和大小写操作: 3.字符串判断内容: 4.字符串剩下操作: ......