python-sunday算法

前言:

是一个比较简单的算法,主要用于字符串与字符串之间的匹配。

这篇文章主要是,用来做笔记,日后方便回顾巩固记忆。

当在力扣中遇到这道简单题目时:

28. 找出字符串中第一个匹配项的下标

        给你两个字符串 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"))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值