实现 strStr()

2023-11-08

实现 strStr()


实现 strStr()函数。

给你两个字符串haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回-1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的strstr()以及 Java 的 indexOf() 定义相符。

示例 1:

输入:haystack = “hello”, needle = “ll”

输出:2

示例 2:

输入:haystack = “aaaaa”, needle = “bba”

输出:-1

示例 3:

输入:haystack = “”, needle = “”

输出:0

提示: 

0 <= haystack.length, needle.length <= 5 * 104 

haystack 和 needle 仅由小写英文字符组成

解题思路


什么是kpm算法? > KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。KMP算法的 [时间复杂度]O(m+n) 。

    1. Kpm算法方式
    • 定义字符串haystack,并赋值为haystack = “hello”;
    • 定义字符串needle,并赋值为needle = “ll”;
    • 定义i和j,并赋值为i = 0 j = 0;
    • 判断字符串为空,返回0,长度为0,返回空;
    • 判断haystack的长度大于i和needle的长度大于j;
    • 如果当前haystack的值等于needle的值,就在原来的基础上加一i+=1 j+=1;
    • 否则j = 0,i如果不匹配,就回退,从第一次匹配的下一个开始;
    • 如果就等于needle的长度,就返回I减去jreturn I - j;
    • 最后返回-1;

      haystack = "hello"
      needle = "ll"
      
      # haystack = "aaaaa"
      # needle = "bba"
      #
      # haystack = ""
      # needle = ""
      
      i = 0
      j = 0
      
      if len(haystack)==0:
      return 0
      if len(needle)==0:
      return 0
      
      while i< len(haystack) and j < len(needle):
      if haystack[i] == needle[j]:
          i+=1
          j+=1
      else:
          # 如果不匹配,就回退,从第一次匹配的下一个开始,
          i = i -j + 1
          j = 0
      
      if j ==  len(needle):
          return i - j
      return -1
      
    1. 双指针方式
    • 定义字符串haystack,并赋值为haystack = “hello”;
    • 定义字符串needle,并赋值为needle = “ll”;
    • 获取haystack的长度,并赋值为n = len(haystack);
    • 定义left和right,并赋值为left = 0 right = len(needle);
    • 如果right等于1,返回0;

    • 判断n大于等于right;
    • 如果haystack左右值为下标等于needlehaystack[left: right] == needle,返回left;
    • 就在原来的基础上加一left+=1 right+=1;
    • 最后返回-1;

      haystack = "hello"
      needle = "ll"
      n = len(haystack)
      left = 0
      right = len(needle)
      if right == 0:
      return 0
      while right <= n:
      if haystack[left: right] == needle:
          return left
      left += 1
      right += 1
      return -1
      
    1. 通过find方式
    2. 定义字符串haystack,并赋值为haystack = “hello”;
    3. 返回查询找到的needle;

      haystack = "hello"
      needle = "ll"
      return haystack.find(needle)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现 strStr() 的相关文章

随机推荐

  • 关于OPenGL贴图莫名其妙扭曲

    原图 效果 这个问题查出来了 OpenGL要求所有的纹理都是4字节对齐的 即纹理的大小永远是4字节的倍数 通常这并不会出现什么问题 因为大部分纹理的宽度都为4的倍数并 或每像素使用4个字节 但是这个图片是jpg并且宽高不是4的倍数 所以出现
  • js获取当前年月日,格式(YYYY年mm月dd日)

    1 显示当前系统年月日 2023 01 21 格式
  • Glide的封装

    package com example et Ustlis import android content Context import android graphics Bitmap import android graphics draw
  • Mac环境下小米手机Root教程

    参考文章 小米手机解锁注意事项 小米手机BL解锁操作指南 小米手机获取 Root 权限教程 详细图文 准备环境 需要Win环境 解锁需要Win环境 解锁工具是exe版本 刷机也需要Win环境 fastboot是exe文件 1 手机解锁 需要
  • Maven基础篇

    一 为什么要使用Maven 随着我们使用越来越多的框架 或者框架封装程度越来越高 项目中使用的 jar 包也越来越多 项目中 一个模块里面用到上百个jar包是非常正常的 框架中使用的 jar 包 不仅数量庞大 而且彼此之间存在错综复杂的依赖
  • Numpy一维array转置

    参考 https www cnblogs com cymwill p 8358866 html 分析 Numpy相关的转置函数有T transpose等 使一维数组转置可以使用reshape实现 实现例子 import numpy as n
  • 单元测试,模拟用户Get登陆,并携带登录后的token访问接口

    HttpClient httpClient HttpClient businessHttpClient private async Task
  • 慢sql和sql注入

    慢SQL是指在数据库中执行的SQL查询或操作的执行时间超过了预期或可接受的时间 这可能是由多种原因引起的 包括查询优化不当 索引缺失 不合理的数据模型设计 高并发负载等 下面是关于慢SQL的详细描述 排查和解决方法 现象 响应时间延迟 查询
  • VS2005自带SQL2005的管理工具

    有很多人对于VS2005自带SQL2005 Express版使用感觉很迷茫 因为它没有自带的管理工具 不过好在官网有SQL2005 Express版配套的管理工具可供下载 有了它 就可以管理SQL2005 Express版了 没有特殊要求的
  • SetThreadAffinityMask中掩码的问题

    在我们进行多线程开发的过程时 常常需要自己分配线程到不同的处理器上运算 以保证我们程序的运行效率 SetThreadAffinityMask是我们常见的选择 1 MSDN中函数的定义 DWORD PTR WINAPI SetThreadAf
  • ubuntu 18.04 radius 服务安装配置

    环境信息 cat etc os release NAME Ubuntu VERSION 18 04 6 LTS Bionic Beaver ID ubuntu ID LIKE debian PRETTY NAME Ubuntu 18 04
  • 火星java_AcWing 420. 火星人(Java 图示 实现next_permutation)

    图示 代码 import java util import java lang public class Main static Scanner scanner new Scanner System in static int n m st
  • Matlab——表达式 阵列与矩阵的创建

    表达式 指令过长 如果一个指令过长可以在结尾加上 下一行继续写指令即可 若不想每次都显示运算结果 只需在运算式最後加上分号 即可 注释 基本的算术运算有 加 减 乘 除 幂次方 范例为 5 3 5 3 5 3 5 3 5 3 设置精度值 t
  • Python默认设置为python3

    1 方法 执行 shell里执行 sudo update alternatives install usr bin python python usr bin python2 100 sudo update alternatives ins
  • 论文中参考文献中大写字母的含义

    方括号内英文字母为文献类型标识 专著 M 论文集 C 学位论文 D 报纸文章 N 期刊文章 J 报告 R 标准 S 专利 P 析出文献 A 其他 Z
  • Android APP之间的跳转

    APP之间的跳转实际上也是Activity之间的跳转 只是需要多配置一些东西 首先在目标APP的清单文件上加多一个intent filter在Activity中
  • QT5+VS2010+openCV2.4.9联调视频小工程

    项目场景 最近在vs上联调qt opencv 光配置环境就配置了一个星期555 配置好环境后仿照教程 https blog csdn net skeeee article details 10187561 编写了第一个联调的demo 后来参
  • qt控件拖动-动态布局-动态控件

    1 lua直接调用qt类库 包括实时ui控制 qt lua 交互 tolua 2 静态连接qt类库 动态控制ui 3 代码生成静态布局 4 代码生成ui
  • 【工作笔记】- maven-shade-plugin打包合并META-INF/services

    今天在项目终于到一个问题 我写了一个简单的Flink SQL的Demo工程 只有一个主类 import org apache flink streaming api environment StreamExecutionEnvironmen
  • 实现 strStr()

    实现 strStr 实现 strStr 函数 给你两个字符串haystack 和 needle 请你在 haystack 字符串中找出 needle 字符串出现的第一个位置 下标从 0 开始 如果不存在 则返回 1 说明 当 needle