代码随想录算法训练营第九天| 28 strStr、 459 重复子串

OpenCV 算法梳理分析 本文系统梳理了OpenCV的核心算法体系,从模块架构到具体函数实现。OpenCV采用分层设计,包含基础I/O、图像处理、特征检测、视频分析和智能算法五大层次,所有模块基于统一的Mat数据结构。重点分析了imgproc模块的8类图像处理算法(滤波、形态学、阈值化等),features2d模块的特征检测与匹配流程(SIFT/ORB等算法对比),以及objdetect、video、calib3d等模块的核心功能。针对不同场景提供了算法选型建议,如高斯噪声推荐GaussianBlur,特征匹配推荐ORB+Flann 阅读详情

28 strStr

1 描述

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

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystack 和 needle 仅由小写英文字符组成

2 代码

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        
        def build_next(s):
            next_ = [0] * len(s)
            i, j = 0, 1
            while j < len(s):
                if s[i] == s[j]:
                    next_[j] = i + 1
                    i += 1
                    j += 1
                else:
                    if i == 0:
                        next_[j] = 0
                        j += 1
                    else:
                        i = next_[i-1]
            return next_
        
        next_ = build_next(needle)
        # print(next_)
        i, j = 0, 0
        while j < len(haystack):
            if haystack[j] == needle[i]:
                j += 1
                i += 1
            else:
                if i == 0:
                    j += 1
                else:
                    i = next_[i - 1]
            
            if i == len(needle):
                return j - i
        
        return -1

3 总结 

 459.重复的子字符串

1 描述

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

  • 输入: "abab"
  • 输出: True
  • 解释: 可由子字符串 "ab" 重复两次构成。

示例 2:

  • 输入: "aba"
  • 输出: False

示例 3:

  • 输入: "abcabcabcabc"
  • 输出: True
  • 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

2 代码

class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        def build_next(s):
            next_ = [0] * len(s)
            i, j  = 0, 1
            while j < len(s):
                # print('---')
                # print(s)
                # print(next_)
                # print(i, j)
                if s[i] == s[j]:
                    next_[j] = i + 1
                    j += 1
                    i += 1
                else:
                    if i == 0:
                        next_[j] = 0
                        j += 1
                    else:
                        i = next_[i - 1] 
            return next_
        
        next_ = build_next(s)
        sub_len = len(s) - next_[-1]
        # print(next_)
        
        return next_[-1] > 0 and sub_len > 0 and len(s) % sub_len == 0

3 总结

  • 背思路
  • 注意 i = next_[i-1]
告别地图偏移!手把手教你用MapOnline V1.2在ArcGIS里加载无偏谷歌影像和历史影像 本文详细介绍了如何使用MapOnline V1.2插件在ArcGIS中加载无偏谷歌影像和历史影像,解决GIS工程师长期面临的地图偏移问题。通过三步安装配置、无偏影像加载和时空分析功能,提升地理信息数据的精确度和工作效率,特别适用于城市规划、环境监测等场景。 阅读详情

相关推荐

北斗导航 | 从零开始学习基于奇偶矢量的接收机自主完好性监测(RAIM)算法及改进

接收机自主完好性监测(Receiver Autonomous Integrity Monitoring, RAIM)是GNSS接收机内部的一种算法,它仅利用冗余的伪距观测量来判断定位结果是否可靠、是否存在故障卫星,并能识别和排除故障卫星。奇偶矢量法是RAIM最经典的实现方式之一,它将不可直接观测的测量误差映射到一个“奇偶空间”中,使故障检测变得简单且服从精确的概率分布。w\mathbf{w}w虽然能反映故障,但它的协方差矩阵不是单位阵,各分量相关,不利于统计检验。奇偶矢量通过一个正交变换P。

尘世冰封的专栏 372

代码随想录算法训练营第九天| 151.翻转字符里的单词、卡码网:55.右旋转字符28. 实现 strStr()、459.重复的子字符

i的变化范围是1到n/2,每隔i个下标的字符是相同的,即s[j] == s[j-i],j的变化范围是i到n。空格问题借助Python字符内置函数split()可以直接得到单词,并且将字符转为了列表,之后再从列表转回字符,使用" ".join()方法。关键在于重复,子字符的长度为i的话,就是每隔i个下标的字符就是相同的,而且要整个数组从头到尾都满足每隔i个下标的字符是相同的。思考:一个字符中至少要由两个相同的子字符组成才满足题意,因此子字符的长度可以从1到n/2。459.重复的子字符

qq_42493281的博客 407

基于OpenCV的实时疲劳检测系统实现

本文介绍了一个基于OpenCV的实时疲劳检测系统,使用Python实现。系统通过Haar级联分类器检测人脸和眼睛,计算眼睛宽高比(EAR)和PERCLOS(眼睛闭合时间比例)来评估疲劳程度,分为4个等级:正常、轻度、中度和重度疲劳。核心代码包含人脸眼睛检测、疲劳评估和可视化显示功能,具有实时性、稳定性和直观的视觉反馈。系统可通过摄像头实时监控驾驶员状态,为疲劳驾驶预警提供简单有效的解决方案。

weixin_62135607的博客 210

代码随想录算法训练营第九天|KMP算法、Leetcode28 实现 strStr()、Leetcode459 重复的子字符

因为 这是相等的前缀和后缀,t[0] 与 k[0]相同, t[1] 与 k[1]相同,所以 s[0] 一定和 s[2]相同,s[1] 一定和 s[3]相同,即:,s[0]s[1]与s[2]s[3]相同。因为 这是相等的前缀和后缀,t[2] 与 k[2]相同 ,t[3]与k[3] 相同,所以,s[2]一定和s[4]相同,s[3]一定和s[5]相同,即:s[2]s[3] 与 s[4]s[5]相同。为什么要前一个字符的前缀表的数值呢,因为要找前面字符的最长相同的前缀和后缀,所以要看前一位的 前缀表的数值。

Demok123的博客 1082

代码随想录算法训练营第九天|28. 实现 strStr(),459.重复的子字符,字符总结 ,双指针回顾

kmp算法理解上还是有难度,其实真要理解起来还好,但是next数组的代码实现还是不太好想,这个视频可以很好的帮助理解。。结合代码随想录节具体步骤和代码实现,会帮助很好的理解KMP算法

stupidyinu的博客 914

代码随想录算法训练营第九天 |28. 实现 strStr()、459.重复的子字符、字符总结、双指针回顾

双指针总结 KMP算法 字符

hewfhpiwjgjfw的博客 1364

代码随想录算法训练营第九天 |●151.翻转字符里的单词 ●卡码网:55.右旋转字符28. 实现 strStr() ●459.重复的子字符

比较简单,大家读一遍就行题目链接/文章讲解:https://programmercarl.com/%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%80%BB%E7%BB%93.html。

2301_80094768的博客 934

代码随想录算法训练营第九天|28. 实现 strStr()、459.重复的子字符

状态:学过又忘了可以暴力,可以kmp,也可以暴力的时间复杂度O(m*n),kmp时间复杂度O(m+n)KMP算法的核心在于next数组,next数组中存放的是 最长相同前缀和后缀的长度,也是在字符不匹配时需要回退的步数。

weixin_43903745的博客 903

代码随想录算法训练营第九天 | 151.反转字符里的单词 卡码55.右旋字符 28.实现strStr() 459.重复的子字符

前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,在某个字符失配时,前缀表会告诉下一步匹配中,模式应该跳到哪个位置。next数组是前缀表,前缀表用来回退的,它记录了模式和主不匹配的时候,模式应该从哪里开始重新匹配;j=0已经到了初始位置没必要回退,next[0]=0,再回退j=next[j-1]下标会出现-1越界。前缀末尾和后缀末尾不匹配的时候,j是向前回退,j看前一位的next数组的值就是要回退的下标。next[1]=1,因为aa只有一个相等的真前缀和真后缀:a,长度为 1。

m0_50413530的博客 714

代码随想录算法训练营第九天|LeetCode151.翻转字符里的单词、卡码网:55.右旋转字符、LeetCode28.实现strStr()、459.重复的子字符

打卡代码随想录算法训练营第49期第九天︿( ̄︶ ̄)︿

tancxiaohei23的博客 623

代码随想录算法训练营第九天 | 151.翻转字符里的单词、右旋字符28. 实现 strStr()、459.重复的子字符

不过这种解法还有一个问题,就是 我们最终还是要判断 一个字符(s + s)是否出现过 s 的过程,大家可能直接用contains,find 之类的库函数, 却忽略了实现这些函数的时间复杂度(暴力解法是m * n,一般库函数实现为 O(m + n))。而且遍历的时候 都不用遍历结束,只需要遍历到中间位置,因为子结束位置大于中间位置的话,一定不能重复组成字符。暴力的解法, 就是一个for循环获取 子的终止位置, 然后判断子是否能重复构成字符,又嵌套一个for循环,所以是O(n^2)的时间复杂度。

2301_80082921的博客 1016

数据库连接算法详解:从基础概念到嵌套循环优化

2.重复键在归并连接中的处理:排序归并连接遇到相同键时,需要保存或回溯同一键对应的记录组,然后输出笛卡尔积。(2)外连接:即使一方没有数据,也保留该侧数据,用NULL填充。对S中的键计算哈希值;(3)连接基数:连接结果的行数可能远大于任意一张输入表。设外表有R个页面,内表S个页面,比较次数O(R+R*S)5.哈希连接的限制:最适用于等值连接,不直接适用于比较。(1)build阶段:对较小的关系R建立哈希表。(1)内连接:只保留两张表之中能够匹配的内容。若R有M行,S有N行,则比较次数为O(MN)

jiangxiaohanya的博客 239

小红书 算法一面 十一

例如 **Soft MoE** 采用这种方式,大幅提升负载均衡性,但会增加计算开销。- **熵正则化**:直接最大化门控概率分布的熵,熵越大表示分布越均匀,公式为 $\mathcal{L}_{ent} = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^K p_{ik}\log p_{ik}$。- **核心原理**:源自 **GShard** 和 **Switch Transformer**,通过最小化专家选择概率分布的熵,迫使门控网络给每个专家分配相近的 token 数量。

XLYcmy的博客 440

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 题目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 260

算法日常・每日刷题--<BFS>4

题目摘要: 给定一个由'X'和'O'组成的矩阵,要求捕获所有被'X'完全包围的'O'区域(即不与边界连通的区域),并将其替换为'X'。解法核心是逆向处理: 标记边界连通区域:遍历矩阵四边,对边界上的'O'进行BFS/DFS,标记所有与之连通的'O'为临时符号(如'.'),表示这些区域未被包围。 批量修改:遍历整个矩阵,将未被标记的'O'(被包围的)改为'X',同时恢复标记的'.'为'O'。 示例: 输入: [['X','X','X','X'], ['X','O','O','X'], ['X','X','O'

2503_92261635的博客 259

10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 223

AI辅助芯片制造:算法与工程化落地

《国产DRAM龙头长鑫科技上市创纪录,AI技术重塑芯片制造新范式》 国产DRAM龙头企业长鑫科技7月27日登陆科创板,创下3.31万亿元市值,成为A股"一哥"。作为大陆唯一实现DRAM大规模量产的IDM企业,长鑫科技标志着国产存储产业的重要突破。随着AI算力需求激增,DRAM市场迎来高速发展期。AI技术正在深度改变芯片制造模式,在工艺仿真、缺陷检测、设备维护等环节发挥关键作用,显著提升良率和效率。长鑫科技高管推荐的新书《AI辅助芯片制造:算法与工程化落地》系统解析了AI赋能半导体制造的实战方案

weixin_43178406的博客 1万+

二刷hot100-70.爬楼梯

dp数组初始化:dp[n+1];

2302_78497251的博客 51

S 曲线加减速算法完整详解(C# 原生实现,无第三方库)

S 曲线加减速是工业运动控制核心轨迹规划算法,相比梯形曲线,依靠约束加加速度 Jerk 实现加速度连续变化,有效消除机械冲击与振动。本文完整讲解七段式 S 曲线原理、阶段推演、时间预规划逻辑,剖析短行程自动裁剪等工程难点。提供无第三方依赖原生 C# 完整实现,内置运动状态机,支持正反方向运动,基于解析多项式实时求解位置、速度、加速度,无积分累积误差。代码可直接用于伺服上位机、模组轨迹发生器,亦可精简移植嵌入式平台。同时对比算法优劣与适用场景,适合工控开发、伺服调试、嵌入式运动算法学习者参考。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 983

Tokenization(分词算法):一切大语言模型的地基

本文深入解析了Tokenization(分词算法)这一大语言模型的基础技术。Tokenization将原始文本切分为模型可处理的子词单元并映射为数字ID,是模型理解文本的第一步。

2301_80194949的博客 203

基于STM32的声源定位摄像头拍照系统详细文档+全部资料+高分项目.zip

【资源说明】基于STM32的声源定位摄像头拍照系统详细文档+全部资料+高分项目.zip【备注】1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。欢迎下载,沟通交流,互相学习,共同进步!

上一篇: 代码随想录算法训练营第八天|344. 反转字符串等
下一篇: 代码随想录算法训练营第十天|232.用栈实现队列、225. 用队列实现栈等
cui_15
博客等级 码龄10年 166粉丝 21原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值