电商网站开发外包,怎样建立一个营销网站,网站建设前期工作,wordpress升级方法28 实现 strStr()
实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串#xff0c;在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在#xff0c;则返回 -1。 示例 1: 输入: haystack “hello”, needle “ll” 输出: 2 示例…28 实现 strStr()
实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在则返回 -1。 示例 1: 输入: haystack “hello”, needle “ll” 输出: 2 示例 2: 输入: haystack “aaaaa”, needle “bba” 输出: -1 说明: **当 needle 是空字符串时我们应当返回什么值呢这是一个在面试中很好的问题。 对于本题而言当 needle 是空字符串时我们应当返回 0 **。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
思路
首先是模式串匹配问题需要先在hatstack文本串中找到needle子串模式串然后再去考虑求这个索引。第一个问题就涉及到KMP算法。KMP的经典思想就是当出现字符串不匹配时可以记录一部分之前已经匹配的文本内容利用这些信息避免从头再去做匹配。 以下代码随想录文字详细说明了KMP算法 https://www.programmercarl.com/0028.%E5%AE%9E%E7%8E%B0strStr.html#%E6%80%9D%E8%B7%AF
解法一-前缀表减一
class Solution(object):# 第一步 首先要求next数组def getNext(self, next, s): # s表示模式串# 初始化j -1next[0] jfor i in range(1, len(s)): # 注意i从1开始 因为要比较 i 和 j是否相同# 前后缀不相同 while j0 and s[i]!s[j1]:j next[j] # j回退# 前后缀相同if s[i]s[j1]:j 1 # i和j都加1next[i] j# 第二步 求下标索引def strStr(self, haystack, needle)::type haystack: str:type needle: str:rtype: intif not needle:return 0next [0]*len(needle) # 初始化nextself.getNext(next, needle)j -1for i in range(len(haystack)):while j 0 and haystack[i]!needle[j1]: # j1是因为j初始值为-1j next[j] # next数组起作用了 找下一个匹配的位置if haystack[i]needle[j1]: # 匹配到字符相同j 1# 判断在文本串里出现了模式串if j len(needle) - 1:return i - len(needle) 1 # 返回索引return -1暴力法
class Solution(object):def strStr(self, haystack, needle)::type haystack: str:type needle: str:rtype: intm, n len(haystack), len(needle)for i in range(m):if haystack[i:in] needle:return ireturn -1 使用index写算法题不推荐
class Solution:def strStr(self, haystack: str, needle: str) - int:try:return haystack.index(needle)except ValueError:return -1使用find写算法题不推荐
class Solution:def strStr(self, haystack: str, needle: str) - int:return haystack.find(needle)