前言:
是一个比较简单的算法,主要用于字符串与字符串之间的匹配。
这篇文章主要是,用来做笔记,日后方便回顾巩固记忆。
当在力扣中遇到这道简单题目时:
给你两个字符串
haystack
和needle
,请你在haystack
字符串中找出needle
字符串的第一个匹配项的下标(下标从 0 开始)。如果needle
不是haystack
的一部分,则返回-1
。
我的第一想法是:利用索引下标index+len(needle)来代替needle匹配haystack
,解决问题。
原先的代码是这样的:
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
count= len(needle)
slow = 0
fast = slow + count
while fast < len(haystack):
if haystack[slow:fast] == needle:
return slow
else:
slow += 1
else:
return -1
sunday算法其实就是相当于在这上面更新,简便算法了。
介绍:
引用leecode的题干,
haystack: 被匹配字符串
needle: 匹配项
slow: 当前索引
slow:fast : 正在匹配的被匹配项
在原先我想的代码中是:
slow从0开始一点点匹配,每次都+1,相当于都要遍历一遍。sunday算法的更新就是在于不需要slow每次+1,因为如果在正在匹配的被匹配项的下个字符中,没有匹配项中的字符。
比如(我自己画的):
如上图,D并不在needle = "EFG" 中,那我们就没必要让slow经过D,也没必要让slow经过BC,所以可以让slow直接变成index(E),再次开始匹配。
这是当D并不是needle中的元素的情况。
还有第二种情况就是,D是needle中的元素。假如此时D就是needle中的F,那么我们就可以人为的让"slow:fast 和F进行匹配,让needle中的F和haystack的这个F进行匹配"。
就像这样。
代码:
# 做一个关于slow需要移动多少的表。
def by_dict(list):
n_len = len(list)
dict1 = dict()
for index,item in enumerate(list):
# 记录,当出现needle中某个字符串时,需要移动的距离
dict1[item] = n_len - index
return dict1
def removeElement(haystack, needle):
h_len = len(haystack)
n_len = len(needle)
dict = by_dict(needle)
slow = 0
while slow + n_len <= h_len:
if haystack[slow:slow + n_len] == needle:
return slow
if slow + n_len == h_len:
return -1
# 捕捉正在匹配的被匹配项后面的第一个字符是否在needle中,在就取出dict中对应的值,不在就直接跳过这个值
slow += dict.get(haystack[slow + n_len],n_len+1)
return -1
print(removeElement("123sadbutsad","sad"))