LeetCode 28:实现strStr() Implement strStr()
爱写bug(ID:icodebugs)
作者:爱写bug
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll"
Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba"
Output: -1
Clarification:
What should we return when needle is an empty string? This is a great question to ask during an interview.
For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
解题思路(Java):
暴力穷举:
复杂度:时间 O(n^2) 空间 O(1)
字符串 a 从第一个索引开始 逐一匹配字符串 b 的第一个索引:
a[i++]==b[0],如果为true,则进入内循环字符串a从第i+j个字符开始与字符串b 第j个字符匹配:a[i+j]==b[j]
代码:
class Solution {
public int strStr(String haystack, String needle) {
if(needle.equals(""))return 0;
int haystackLen=haystack.length(),needleLen=needle.length();
char firstChar=needle.charAt(0);
for(int i=0;i
KMP算法:
复杂度:时间 O(n+m) 空间 O(M) 下面引用一组图片帮助理解(图片来源:https://blog.csdn.net/v_july_v/article/details/7041827 ): 说明: 图片中字符串haystack为:"BBC ABCDAB ABCDABCDABDE",模式串 needle 为:"ABCDABD"第一步开始匹配:
可以看到图片中一下跳过了 haystack 五个字符ABCDAB 和 needle 的两个字符AB。优化思路很清晰。第二步匹配到第一个相同字符:
第三步两个字符串逐一向后匹配,直到到字符 D 与 空格 字符匹配失败,结束该轮次匹配:
第四步重新匹配,但不用从第二步的下一个字符 B 开始,因为空格字符前与模式字符串前6个字符已经匹配相同。既C字符之前的两个字符 AB 与空格字符前两个字符 AB 相同,两个字符串可直接从 空白 字符与 C 字符开始匹配:
代码:
class Solution {
public int strStr(String haystack, String needle) {
if(needle.equals("")) return 0;
int[] next = new int[needle.length()];
getNext(next, needle);// 得到next数组
// i是匹配串haystack的指针,j是模式串needle的指针
int i = 0, j = 0;
while(i
总结:
KMP算法优化的方向很明了,主要难点就在于对next数组的求法和理解,KMP算法不是本文的重点,如有兴趣深入了解,推荐一篇博文:https://blog.csdn.net/v_july_v/article/details/7041827
另外还有Sunday算法 是找到与模式字符串相同长度的源字符串 从右向左匹配,其中心思想为:
- 如果该字符没有在模式串中出现,直接从该字符向右移动位数 = 模式串长度 + 1。(因为源字符串含有该字符的相同长度字符串不可能匹配)
- 如果该字符在模式串中出现过,其移动位数 = 模式串中最右端的该字符到末尾的距离+1。
字符串haystackBBC ABC 与模式串needle ABCDABD 匹配,字符串haystack中的空格字符未在模式串needle 中出现,则可以直接跳过空格字符后面六个字符的匹配,因为包含空格字符的相同长度字符串都不可能匹配成功,所以可以跳过6个。
Python3:
说明:上面两种方法在所有语言都可行,只是语法不同,所以在py3中不再复现,仅展示一些py3特有的语法投机取巧解题。
利用py3内建函数find()直接得结果。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
return haystack.find(needle)
find() 方法描述
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果指定范围内如果包含指定索引值,返回的是索引值在字符串中的起始位置。如果不包含索引值,返回-1。如果子字符串为空,返回0。
语法
str.find(str, beg=0, end=len(string))
参数
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
利用py3字符出切片特性解决:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
for i in range(len(haystack)-len(needle)+1):
if haystack[i:i+len(needle)]==needle:#截取切片
return i
return -1
注:算法导论第32章:字符串匹配有完整的一章相关讨论。

LeetCode 28:实现strStr() Implement strStr()的更多相关文章
- LeetCode专题-Python实现之第28题: Implement strStr()
导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...
- Leetcode 详解(Implement strstr)
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- leetcode第27题--Implement strStr()
Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if need ...
- [Swift]LeetCode28. 实现strStr() | Implement strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- 【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 ...
- [Leetcode][Python]28: Implement strStr()
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 28: Implement strStr()https://oj.leetco ...
- 44. leetcode 28. Implement strStr()
28. Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in ha ...
- C# 写 LeetCode easy #28 Implement strStr()
28.Implement strStr() Implement strStr(). Return the index of the first occurrence of needle in hays ...
- 【LeetCode】28. Implement strStr() (2 solutions)
Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haysta ...
随机推荐
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- iis7 下配置 ASP.NET MVC 项目遇到的问题 (WIN7 64位 旗舰版 第一次配置站点)
转自 https://www.cnblogs.com/Leo_wl/p/3866625.html,再次感谢 指定的目录或文件在 Web 服务器上不存在. URL 拼写错误. 某个自定义筛选器或模块(如 ...
- css sprite responsive实现探究
在做web app前端设计时,为了减少http的请求,提高系统响应时间,有一个非常常见的优化措施是:将所有用到的静态的图片通过合并形成一个sprite.png,并且配合background-posit ...
- asp.net实现页面跳转后不可以返回
window.history.go(0); Response.Write("<script> window.history.go(0);alert('恭喜user注册成功!!!\ ...
- python 排序 拓扑排序
在计算机科学领域中,有向图的拓扑排序是其顶点的先行排序,对于每个从顶点u到顶点v的有向边uv,在排序的结果中u都在v之前. 如果图是有向无环图,则拓扑排序是可能的(为什么不说一定呢?) 任何DAG具有 ...
- CentOS7 vsftp 安装与配置(视频教程)
(双击全屏播放) 1.安装vsftpd yum install -y vsftpd 2.编辑ftp配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO ...
- canvas的常用功能(电脑版)
前言: canvas可以单独算为前端的一大知识模块, 今天就研究一下. 先做下前文铺垫: ①创建canvas <canvas id="myCanvas" width=&quo ...
- Ubuntu16.04的搭建l.2.t.p.d(宿舍访问公司内网)
主要的实现步骤 openswan(ipsec) : 提供一个密钥 ppp :提供用户名和密码 xl2tpd : 提供L2TP服务 sysctl : 提供服务器内部转发 iptables : 提供请求从 ...
- MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信
MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信 MQTT实战2 - 使用MQTTnet实现mqtt通信 源码下载 -> 提取码 QQ:505645074 MQTT ...
- Windows 下 pycharm 创建Django 项目【用虚拟环境的解释器】
1. 背景 我在 Windows 下的 pycharm 直接创建 全新 Django 项目 会 pip 和其他报错 ,暂时解决不了,另外后续的多个项目只需要一套python 环境, 所以可以 ...