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代码见:

 class Solution {
public:
int strStr(char *haystack, char *needle) {
int num = strlen(needle);
int *next = new int[num];
getNext(needle, next); int i = ;
int j = ;
while (haystack[i] != '\0' && needle[j] != '\0') {
if (haystack[i] == needle[j]) {
++i;
++j;
} else if (j == ) {
++i;
} else {
j = next[j - ];
}
} free(next);
if (needle[j] != '\0')
return -;
else
return i - j;
} void getNext(char *needle, int *next) {
int i = ;
int j = ;
next[] = ;
while (needle[i] != '\0') {
if (needle[i] == needle[j]) {
next[i] = j + ;
++i;
++j;
} else if (j == ) {
next[i] = ;
++i;
} else {
j = next[j - ];
}
}
}
};

代码优化:

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

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

AC代码如下:

 class Solution {
public:
int strStr(char *haystack, char *needle) {
int num = strlen(needle);
int *next = new int[num];
getNext(needle, next); int i = ;
int j = ;
while (haystack[i] != '\0' && j < num) {
if (j == - || haystack[i] == needle[j]) {
++i;
++j;
} else {
j = next[j];
}
} free(next);
if (needle[j] != '\0')
return -;
else
return i - j;
} void getNext(char *needle, int *next) {
int i = ;
int j = -;
int strl = strlen(needle);
next[] = -;
while (i < strl - ) {
if (j == - || needle[i] == needle[j]) {
next[++i] = ++j;
} else {
j = next[j];
}
}
}
};

【Leetcode】【Easy】Implement strStr()的更多相关文章

  1. 【LeetCode题意分析&解答】40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 【LeetCode题意分析&解答】35. Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  4. 【leetcode刷题笔记】Implement strStr()

    Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...

  5. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  6. C# 写 LeetCode easy #28 Implement strStr()

    28.Implement strStr() Implement strStr(). Return the index of the first occurrence of needle in hays ...

  7. 【LeetCode算法-28/35】Implement strStr()/Search Insert Position

    LeetCode第28题 Return the index of the first occurrence of needle in haystack, or -1 if needle is not ...

  8. 【LeetCode算法题库】Day4:Regular Expression Matching & Container With Most Water & Integer to Roman

    [Q10] Given an input string (s) and a pattern (p), implement regular expression matching with suppor ...

  9. 【LeetCode算法题库】Day7:Remove Nth Node From End of List & Valid Parentheses & Merge Two Lists

    [Q19] Given a linked list, remove the n-th node from the end of list and return its head. Example: G ...

  10. 【LeetCode算法题库】Day3:Reverse Integer & String to Integer (atoi) & Palindrome Number

    [Q7]  把数倒过来 Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Outpu ...

随机推荐

  1. (POJ - 1050)To the Max 最大连续子矩阵和

    Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...

  2. 剑指offer——面试题15:二进制中 1的个数

    // 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...

  3. Tomcat疑难杂症解决记录

    1. startup.bat闪退 cmd中运行startup.bat报错: The JRE_HOME environment variable is not defined correctly Thi ...

  4. PIXI 宝物猎人(7)

    介绍 ,本实例来自官网 代码结构 打开 treasureHunter.html 文件,你将会看到所有的代码都在一个大的文件里.下面是一个关于如何组织所有代码的概览: //Setup Pixi and ...

  5. 2019.03.26 读书笔记 关于event

    event 主要是给委托加了一层保护,不能任意的 class.delegate=null,class.delegate=fun1,不能由调用者去任意支配,而是由class自己去增加或减少,用+=.-= ...

  6. (转)CentOS6/7 使用saltstack源安装saltstack

    CentOS6/7 使用saltstack源安装saltstack 原文:https://blog.csdn.net/wh211212/article/details/77053708 CentOS ...

  7. Beam概念学习系列之Pipeline 数据处理流水线

    不多说,直接上干货! Pipeline 数据处理流水线 Pipeline将Source PCollection ParDo.Sink组织在一起形成了一个完整的数据处理的过程. Beam概念学习系列之P ...

  8. Linux定时任务与开机自启动脚本(cron与crontab)

    开机自启动脚本 网上常见的脚本开机自启方法是: 假设要自启的脚本位于 /home/user/test.sh 给脚本可执行的权限 sudo chmod +x /home/user/test.sh 将脚本 ...

  9. javascript遍历表

    定义表结构 1. 通过id遍历 <html> <body> <table id="tb" border="1"> <t ...

  10. vue-cli 3.x安装配置步骤详细说明

      一.vue-cli 3.x简单介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统:是一个类似于 create-react-app 的可以用例命令行快速配置和生成一个 vue 项 ...