首页 > 其他分享 >28. 找出字符串中第一个匹配项的下标

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

时间:2023-10-28 20:13:34浏览次数:29  
标签:下标 needle 28 next str 字符串 haystack

目录

题目

  • 给你两个字符串 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 。

法一、KMP

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        def getNext(p):
            _next = [0] * (len(p)+1) #初始化next数组
            _next[0] = -1
            i,j = 0,-1
            while i  <len (p):
                if j==-1 or p[i] == p[j]:#如果j==-1或者两个指针的值相等
                    i+=1#i前进1步:匹配上了
                    j+=1#j前进1步:长度加1
                    _next[i]=j#把长度存进当前next数组
                else:#如果两个指针的值不相等
                    j=_next[j]#回到头部位置
          
            return _next
            
        def kmp(s,p,_next):
            i=j=0#i遍历主串j遍历子串
            while i<len(s) and j<len(p):
                if j==-1 or s[i]==p[j]:#匹配上了
                    i += 1#主串指针后移1位
                    j += 1#子串指针后移1位
                else:#匹配失效
                    #主串指针不动,子串指针查next数组进行移动
                    j=_next[j]
          
            if j==len(p):#字串走完了,每一个字母都匹配
                return i-j#返回主串中第一次出现子串的下标
            else:
                return -1
        return kmp(haystack,needle,getNext(needle))

法二、切片

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle in haystack:#先用in判断needle是否在haystack里
            for i in range(len(haystack)):#遍历haystack
                if haystack[i] == needle[0]:#找到与needle第一个字母相同的地方
                    if haystack[i:i+len(needle)] == needle:#再对haystack切片needle的长度,如果等于needle就返回答案了,如果不相等,就继续遍历。
                        return i
        else:#如果needle是否在haystack里直接返回-1
            return -1

法三、两行

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        try:
            return haystack.index(needle)
        except:
            return -1

标签:下标,needle,28,next,str,字符串,haystack
From: https://www.cnblogs.com/lushuang55/p/17792787.html

相关文章

  • 如何遍历字符串的单词?
    内容来自DOChttps://q.houxu6.top/?s=如何遍历字符串的单词?如何遍历由空格分隔的单词组成的字符串中的单词?请注意,我对C字符串函数或那种字符操作/访问不感兴趣。我更喜欢优雅而不是效率。我目前的解决方法:#include<iostream>#include<sstream>#include<string>using......
  • 10.28每日总结
    最近几天心情不太好,想了很多事情,为什么要这么做,我真正想要什么,好像做什么也不对万幸的是,我还能找到答案:1.我们要有自己的思想,如果失败与错误需要反思,那么成功的经验也同样重要。2.人生想要什么就要学会自己努力去争取,因为畏惧失败或者恐惧现实,就把想法藏在心中,成为一个自欺欺人......
  • test20231028
    最小丑的一回(好像并不是)T1是个简单题,只要会高中基础几何就行了。T2看上去是个暴力,然后我也写了个暴力,结果跑大样例dfs进行到两万多层的时候RE了,完全不知道为什么,然后调调调调了一个多小时,到了十点放弃T2开始干T3。T3看起来是个数学题,然后退式子,推推推大概半个小时过......
  • 【pwn】[MoeCTF 2022]babyfmt --格式化字符串漏洞,got表劫持
    拿到程序,先checksec一下发现是PartialRELRO,got表可修改当RELRO保护为NORELRO的时候,init.array、fini.array、got.plt均可读可写;为PARTIALRELRO的时候,ini.array、fini.array可读不可写,got.plt可读可写;为FULLRELRO时,init.array、fini.array、got.plt均可读不可写。然后看主......
  • P5289 [十二省联考 2019] 皮配
    很容易想到设\(dp_{i,j,k}\)表示考虑前\(i\)个阵营,\(C_0=j\),\(D_0=k\)时的方案数,层内转移时可以用辅助数组对两种阵营决策分别转移,此时时间复杂度为\(O(nM^2)\)。考虑\(k=0\)的情况,如果我们能做这个的话,\(k=30\)其实就是在暗示我们把特殊选手拆出来单独做。而如果所有选......
  • CD4028B是BCD到十进制或二进制到八进制解码器
    概述■CD4028B是BCD到十进制或二进制到八进制解码器,由4个输入、解码逻辑门和10个输出缓冲器组成。应用于4个输入(A、B、C和D)的BCD码在选定的10进制1解码输出处产生高电平。类似地,应用于输入a、B和C的3位二进制代码在输出0–7处以八进制解码。D输入处的高电平信号禁止八进制解码,并导......
  • Log4J2漏洞(CVE-2021-44228)原理
    Log4J2漏洞(CVE-2021-44228)原理一、漏洞简介ApacheLog4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。2021年11月24日,阿里云安全团队向Apache官方报告了ApacheLog4j2远程代码执行漏洞。该漏洞是由于A......
  • C++字符串
    C++字符串C++提供了两种类型的字符串表示形式:C风格字符串C++引入的string类类型C风格字符串C风格的字符串源于C语言,并在C++中继续得到支持。字符串实际上是使用Null字符终止的一堆字符数组。因此一个以NULL结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了......
  • php反序列化2023/10/28
    题目来源:[第五空间2021]pklovecloud题目代码如下:<?phpinclude'flag.php';classpkshow{functionecho_name(){return"Pkverysafe^.^";}}classacp{protected$cinder;public......
  • Leetcode 283. 移动零
    移动零题目链接283.移动零给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]题目解释这道题目......