【Leetcode】【Easy】Implement strStr()

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

 

解题:

本题为典型的KMP算法考察题,KMP算法描述为:

  设主串S,匹配串P,i为S的索引下标,j为P的索引下标,初始i和j设置为0。

  在i小于S的长度和j小于P的长度时,开始循环:

  1、比较S[i]和P[j]是否相同;

  2、如果相同则i++,j++,返回执行第1步;

  3、如果不同,则计算已匹配成功的P[0]~P[j-1]中,相同前缀和后缀的最大长度,设为n;

  4、令i不变,j为n(指向相同前后缀的后一个字符),返回执行第1步;

  循环结束时,查看j值是否等于P的长度,如果等于则匹配成功,否则主串中不包含匹配串。

计算最长相同前后缀:

  新建一个数组a,数组长度为匹配串P长度。数组的每一位a[i],表示由P[0]~P[i]表示的字符串,最长相同前后缀的位数;

  a[0]初始化为0,令i为1,j为0,对于a[i](0<i<len)有两种情况:

  1、如果P[j] == P[i],那么a[i] = a[i - 1] + 1;

     接着j++,i++重新执行第一步;

  2、当P[j] != P[i],如果j此时为0,表示由P[0]~P[i]组成的字符串没有相同的前缀和后缀,所以a[i]=0,i++继续进行第一步;

  3、当P[j] != P[i],并且j不为0,表示可能包含相同前缀和后缀,则令j = a[j - 1],继续执行第一步;

  直到计算出所有a[i]的值。

 

AC代码见:

 1 class Solution {
 2 public:
 3     int strStr(char *haystack, char *needle) {
 4         int num = strlen(needle);
 5         int *next = new int[num];
 6         getNext(needle, next);
 7         
 8         int i = 0;
 9         int j = 0;        
10         while (haystack[i] != '\0' && needle[j] != '\0') {
11             if (haystack[i] == needle[j]) {
12                 ++i;
13                 ++j;
14             } else if (j == 0) {
15                 ++i;
16             } else {
17                 j = next[j - 1];
18             }
19         }
20         
21         free(next);
22         if (needle[j] != '\0')
23             return -1;
24         else
25             return i - j;
26     }
27     
28     void getNext(char *needle, int *next) {
29         int i = 1;
30         int j = 0;
31         next[0] = 0;
32         while (needle[i] != '\0') {
33             if (needle[i] == needle[j]) {
34                 next[i] = j + 1;
35                 ++i;
36                 ++j;
37             } else if (j == 0) {
38                 next[i] = 0;
39                 ++i;
40             } else {
41                 j = next[j - 1];
42             }
43         }
44     }
45 };
View Code

 

代码优化:

实际编写中,为了避免判定j是否为0,简化操作。可以设定next数组,取代a数组。next的含义是,当kmp算法需要寻找子串下一个比较的位置时,直接从next数组中取值;

其中next[0] = -1作为哨兵位,next[i] = a[i - 1],即将a数组整体后移一位保存在next数组中。

AC代码如下:

 1 class Solution {
 2 public:
 3     int strStr(char *haystack, char *needle) {
 4         int num = strlen(needle);
 5         int *next = new int[num];
 6         getNext(needle, next);
 7         
 8         int i = 0;
 9         int j = 0;        
10         while (haystack[i] != '\0' && j < num) {
11             if (j == -1 || haystack[i] == needle[j]) {
12                 ++i;
13                 ++j;
14             } else {
15                 j = next[j];
16             }
17         }
18         
19         free(next);
20         if (needle[j] != '\0')
21             return -1;
22         else
23             return i - j;
24     }
25     
26     void getNext(char *needle, int *next) {
27         int i = 0;
28         int j = -1;
29         int strl = strlen(needle);
30         next[0] = -1;
31         while (i < strl - 1) {
32             if (j == -1 || needle[i] == needle[j]) {
33                 next[++i] = ++j;
34             } else {
35                 j = next[j];
36             }
37         }
38     }
39 };

 

转载于:https://www.cnblogs.com/huxiao-tee/p/4227362.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Animations动画使用详解

一、动画类型 Android的animation由四种类型组成&#xff1a;alpha、scale、translate、rotate XML配置文件中 alpha渐变透明度动画效果scale渐变尺寸伸缩动画效果translate画面转换位置移动动画效果rotate画面转移旋转动画效果Java Code代码中 AlphaAnimation渐变透明度动画效…

Jenkins入门指南

新手学习使用Jenkins 安装好Jenkins后如何运行脚本 1.新建item 2.输入任务名称&#xff0c;选择项目类型&#xff0c;点击确定 3.填个描述就好了&#xff0c;新手学jenkins&#xff0c;其他都不看&#xff0c;跑起来再说 4.点这个高级&#xff0c;选择你要运行的脚本所在…

Sublime Text 3 史上最性感的编辑器

↑ ↑ ↑ ↑ ↑ 请看文件夹 ↑ ↑ ↑ ↑ ↑ 下载 / 安装 windows / MAC OS 官网下载&#xff0c;双击安装&#xff0c;这个都会吧&#xff5e; linux linux下安装&#xff0c;一种办法是从官网下载 tar.bz &#xff0c;手动安装。 这里介绍用 apt-get 自己主动安装方法&#xf…

[转]怎么查看和修改 MySQL 的最大连接数?

使用 MySQL 数据库的站点&#xff0c;当访问连接数过多时&#xff0c;就会出现 "Too many connections" 的错误。出现这种错误有两种情况&#xff0c;一种是网站访问量实在太大&#xff0c;服务器已经负担不起&#xff0c;此时就应该考虑负载均衡或者其它减少服务器压…

对qps、tps、pv、uv的理解

QPS &#xff08;Queries Per Second&#xff09;&#xff1a;每秒查询数&#xff08;个别地方叫每秒查询率&#xff1f;每秒查询率是个奇怪的东西&#xff0c;每小时时速&#xff1f;&#xff09;&#xff0c;表示系统在一秒内处理的查询次数。 TPS&#xff08;Transactions …

swift入门之TableView

IOS8更新了&#xff0c;oc还将继续但新增了swift语言&#xff0c;能够代替oc编写ios应用&#xff0c;本文将使用swift作为编写语言&#xff0c;为大家提供step by step的教程。 工具 ios每次更新都须要更新xcode&#xff0c;这次也不例外&#xff0c;但使用xcode6&#xff0c;须…

Training-ActionBar

阅读&#xff1a;http://developer.android.com/training/basics/actionbar/index.html 对于API11以下的兼容&#xff1a; Update your activity so that it extends ActionBarActivity. For example: public class Main Activit yextends ActionBarActivity{...} In your mani…

Jmeter BeanShell学习(一) - BeanShell取样器(一)

通过利用BeanShell取样器设置请求发送的参数。 第一步&#xff1a;添加BeanShell取样器 第二步&#xff1a;在BeanShell中输入执行的代码 log.info("脚本开始执行"); //意思是将字符串输出到日志消息中 vars.put("username","123163.com");//…

【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型...

原文网址&#xff1a;http://www.crifan.com/python_head_meaning_for_usr_bin_python_coding_utf-8/ #!/usr/bin/python 是用来说明脚本语言是python的 是要用/usr/bin下面的程序&#xff08;工具&#xff09;python&#xff0c;这个解释器&#xff0c;来解释python脚本&#…

分布式系统介绍-PNUTS

PNUTS是Yahoo!的分布式数据库系统&#xff0c;支持地域上分布的大规模并发操作。它根据主键的范围区间或者其哈希值的范围区间将表拆分为表单元&#xff08;Tablet&#xff09;&#xff0c;多个表单元存储在一个服务器上。一个表单元控制器根据服务器的负载情况&#xff0c;进行…

Jmeter BeanShell学习(一) - BeanShell取样器(二)

利用BeanShell取样器获取接口返回的JSON格式的结果&#xff0c;并将该结果写入到文件。 第一步&#xff1a;添加BeanShell取样器 前面几个取样器的内容查看&#xff1a; https://blog.csdn.net/goodnameused/article/details/96985514 第二步&#xff1a;查看返回的结果格式 …

在数据库中outlet、code、outline为联合组件。hibarnate插入可如此插入

hibarnate对象的映射文件如下 <id name"outlet" type"string"> <column name"OUTLET" length"10" /> <generator class"assigned" /> </id> <!-- <property name"code" type"…

日怎么没人告诉我这博客可以改博文界面的显示宽度的

于是我妥妥的回归了。 weebly虽然定制功能强大&#xff0c;还能穿越时空发博文&#xff0c;但是太麻烦了&#xff0c;而且用着也不像一个博客。 既然解决了这个问题&#xff0c;那Lofter除了行间距也没什么缺点了&#xff0c;接着用吧&#xff0c;反正weebly也传不了大图&#…

160 - 50 DueList.5

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 可以看出程序有加壳&#xff0c;那么我们下一步就是脱壳了。 0x01 脱壳 看上去没什么特别的地方&#xff0c;就直接 单步跟踪法 来脱壳吧 近call F7&#xff0c;远call F8 来到这里 哈&…

firefox浏览器中silverlight无法输入问题

firefox浏览器中silverlight无法输入问题今天用firefox浏览silverlight网页&#xff0c;想在文本框中输入内容&#xff0c;却没想到silverlight插件意外崩溃了。google一下&#xff0c;发现这是firefox的设置问题&#xff0c;解决方法如下&#xff1a; 1、在Firefox浏览器地址栏…

关键路径的概念和算法

AOE网&#xff1a;在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边表示活动&#xff0c;边上的权值表示活动的持续时间&#xff0c;称这样的有向图叫做边表示活动的网&#xff0c;简称AOE网。AOE网中没有入边的顶点称为始点&#xff08;或源点&am…

160 - 51 DueList.6

环境&#xff1a; Windows xp sp3 工具&#xff1a; Ollydbg exeinfope 0x00 查壳 发现程序没有加壳&#xff0c;那么我们可以直接分析了。 0x01 分析 运行程序看一看 看到错误信息的字符串后我们可以直接搜索了。 可以看到程序会比较输入的长度是否为8位&#xff0c;如…

宽带上行速率和下行速率的区别

本文由广州宽带网http://www.ymeibai.com/整理发布&#xff0c;广州电信宽带报装&#xff0c;上广州宽带网。 我们一般所说的4M宽带&#xff0c;6M宽带&#xff0c;都是指宽带的下行速率&#xff0c;可以理解为就是下载的速度&#xff0c;平时我们用迅雷、或者网页下载软件时&a…

LazyInitializationException--由于session关闭引发的异常

1,页面中进行person.department.departmentName的读取 2,Action 中只读取了person&#xff0c;事务作用在Service的方法中 3,后台会有org.hibernate.LazyInitializationException出现 因为&#xff1a;Action中Service方法结束之前&#xff0c;session已经关闭了转载于:https:/…

160 - 52 egis.1

环境&#xff1a;windows xp 工具&#xff1a; 1、OllyDBG 2、exeinfo 3、IDA 0x00 查壳 加了UPX壳&#xff0c;那么就要脱壳了。可以使用单步法来脱壳。 UPX壳还是比较简单的&#xff0c;开头pushad&#xff0c;找个popad&#xff0c;然后就是jmp了。 然后就可以用OD来…