首页 > 编程语言 >代码随想录算法训练营第9天 |

代码随想录算法训练营第9天 |

时间:2024-06-11 12:44:44浏览次数:31  
标签:return 训练营 needle 随想录 len next 算法 字符串 haystack

28.strStr()
https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/
实现strStr()代码随想录
https://programmercarl.com/0028.实现strStr.html#思路
459.重复字符串
https://leetcode.cn/problems/repeated-substring-pattern/submissions/538631105/
重复字符串代码随想录
https://programmercarl.com/0459.重复的子字符串.html#其他语言版本

实现strStr() —— 字符串匹配

题目

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

题解方法——KMP

举例:aabaaf
前缀:a;aa;aab;aaba;aabaa;
后缀: f;af;aaf;baaf;abaaf;
前缀表:求最长相等前后缀->遇见冲突位置向前回退

字符串 最长相等前后缀
a 0
aa 1
aab 0
aaba 1
aabaa 2
aabaaf 0

得到next表后,挨个匹配。j表示在模式中的遍历。如果字符串和模式不匹配,回退到上一个匹配点,继续匹配。

题解代码

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

459.重复字符串

题目

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成

题解

  • 思路1:移动匹配:移动匹配法。如果内部是由重复字符串组成,那必然前后重组的新字符串中也包含原有的字符串;即s[1:]+s[:-1]中也含有s
  • 思路2:找到最大相同前后缀,len(s)-最大相同前后缀的长度是否能整除;如果可以整除,则说明是重复模块;
## 思路1
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        if len(s)<=1:
            return False
        ss = s[1:]+s[:-1]
        return ss.find(s)!=-1
## 思路2
class Solution:
    def getnext(self,s):
        next_ = [0]*len(s)
        j = 0
        for i in range(1,len(s)):
            while j>0 and s[j]!=s[i]:
                j = next_[j-1]
            if s[j]==s[i]:
                j = j+1
            next_[i] = j
        return next_
    def repeatedSubstringPattern(self, s: str) -> bool:
        if len(s)==0:
            return True
        next_ = self.getnext(s)
        if next_[-1]!=0 and len(s)%(len(s)-next_[-1])==0:
            return True
        else:
            return False

标签:return,训练营,needle,随想录,len,next,算法,字符串,haystack
From: https://www.cnblogs.com/P201821440041/p/18241847

相关文章

  • Dijkstra 算法的手动分析
    目录Dijkstra算法step0.初始状态step1.第一轮step2.第二轮step3.第三轮step4.第四轮Dijkstra算法以下面有向图为例:graphLRV0((V0))--10-->V1((V1))V0((V0))--5-->V4((V4))V1((V1))--2-->V4((V4))V4((V4))--3-->V1((V1))V1((V1))--1-->V2((V2)......
  • RSA算法中,为什么需要的是两个素数?
    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全、密码学、联邦学习、同态加密等隐私计算领域的技术和内容。RSA算法中,为什么需要的是两个素数?RSA算法是一种广泛使用的非对称加密技术,基于大数分解的困难性。本文将探讨为什么RSA算法需要两个素数,并以通......
  • 数据结构---排序算法
    个人介绍hellohello~,这里是code袁~......
  • 代码随想录算法训练营第七天 |
    454.四数相加题目:给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0解题:思路:使用map,key为a+b,value为出现次数。再遍历k、l寻找0-a-b。关键:遍历......
  • 【算法与数据结构】【数组篇】【题1-题5】
    1.数组基本知识点1.1概念数组就是一个集合。数组会用一些名为索引的数字来标识每项数据在数组中的位置,且在大多数编程语言中,索引是从0算起的。我们可以根据数组中的索引,快速访问数组中的元素。数组中的元素在内存中是连续存储的,且每个元素占用相同大小的内存。1.2相关操......
  • LeetCode 算法:缺失的第一个正数c++
    原题链接......
  • 【算法学习】圆方树——处理仙人掌的利器
    圆方树大概分两种,一个是圆方树,一个是广义圆方树。圆方树这可以解决仙人掌上的问题。任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。很多题解将其作为无向图构建,本文将其构建为外向树,在这个问题中两种构建方式不会影响求解。构建方式记读入的图为原图,构建的......
  • 二叉树相关算法题汇总-go语言实现
    总结先序中序后序遍历就能解决一些算法题。层次遍历使用队列。从左子树、右子树获取答案,然后结合根节点来计算答案。前缀树,比Hashset更稳定。O(1),只不过占内存。trie树。递归。递归,递归。到叶子节点收集答案。然后移除路径。packagemainimport( "fmt" "math......
  • 程序设计与算法(三)C++:第四章poj代码
    课程:北京大学程序设计与算法(三)   MOOCOJ:OpenJudge014:MyString这个题需要写的函数有点多我们来分析一下。charw1[200],w2[100]; while(cin>>w1>>w2){ MyStrings1(w1),s2=s1;//构造函数题目有了,不用写//复制构造函数没有,需要写 MyStrings3......
  • 代码随想录算法训练营第三十五天 | 1005.K次取反后最大化的数组和 134.加油站 135.分
    1005.K次取反后最大化的数组和题目链接文章讲解视频讲解思路:  按绝对值从大到小排序  遍历数组,遇到负数,如果次数未用完就取反  最后如果剩余次数未用完且为奇数就将数组最后一个元素取反classSolution{staticboolmyCompare(constint&lhs,constint&r......