分析题目
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
实例:
输入: haystack = “hello”, needle = “ll”
输出: 2
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
算法初学者在刷题的时候要有一个清晰的思维:
1.这个题是什么类型的?
这个题很明显 是字符串匹配问题
2.需不需要用特殊的算法或者数据类型?
知道问题类型之后以后,推荐看完数据结构或者算法的相应章节再来解决这个问题(大佬请无视)本题就需要看数据结构(清华大学出版社)的第四章串之后再来做。
总有一些人很莽(比如早时候我自己)总是什么都一知半解就来做算法题,然后很长时间做出来了(但是在你之前已经有很多比你聪明的大佬已经找出了很多的强力算法),浪费了自己的时间
要明白我们刷题的目的就是为了熟悉数据结构和相应的算法,(不是显示自己的聪明才智)要学会站在巨人的肩膀上。
暴力法
暴力法的思想很简单:
1。处理特殊情况:needle字符串为空,haystack字符串为空,haystack的长度小于needle字符串
2.设置两个指针i,j分别指向字符串和模式串的开头
3.对i进行循环 :
如果j已经指到模式串的最后,那么匹配成功,返回。
如果needle的第j个和haystack的第i相等 那么i,j都想后移动一位
如果不相等的话 i向后回退j步,同时j回退到模式串的开头
4.处理特殊情况,模式串的最后一个正好和字符串的最后一个匹配,返回。
5.,搜索整个字符串后,如果不能j不能指到最后的字符,那么就搜索失败。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if len(needle) == 0:
return 0;
if len(haystack) == 0:
return -1
if len(haystack) < len(needle):
return -1
j =0;
i = 0
while i < len(haystack):
if j == len(needle):
return i - len(needle)
if j == -1 or haystack[i] == needle[j]:
i += 1
j += 1
else:
# i -= j
j = next[j]
# i += 1
print(i)
if j == len(needle):
return i - len(needle)
return -1
KMP匹配法
KMP算法就是在暴力法的基础上进一步优化,为模式串创建一个next数组,来进一步优化匹配过程,具体算法讲解可以看KMP算法讲解。这个讲解讲的相当好了,不多说放代码:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
if len(needle) == 0: # 下面三个if处理三个特殊情况
return 0;
if len(haystack) == 0:
return -1
if len(haystack) < len(needle):
return -1
j =0;k = -1;m = 0 #各种变量的初始化
i = 0;next = [0 for i in range(len(needle))]
print(next)
next[0] = -1
while m < len(needle) - 1: #这个while循环创建模式串的next数组,注意不能使用for循环
print(k,m)
if k == -1 or needle[k] == needle[m]:
k += 1;m += 1
next[m] = k
else:
k = next[k]
print(next)
while i < len(haystack): # 这个while是执行匹配过程,需要注意这里不能使用python的for循环
if j == len(needle):
return i - len(needle)
if j == -1 or haystack[i] == needle[j]:
i += 1
j += 1
else:
# i -= j
j = next[j]
# i += 1
print(i)
if j == len(needle):#这个if是处理特殊情况就是字符串的最后一个字符和模式串的结尾字符匹配
return i - len(needle)
return -1
吐槽一下,在leetcode上暴力法比KMP的时间还短,我才刚开始刷题不久,如有错漏之处还望指正