• 字符串匹配算法——Sunday


    字符串匹配算法——Sunday

    听到字符串匹配,我们第一想到的是经典的KMP算法,为什么会是它,因为它实在是太经典了。但是我们今天要讲的是另一个算法,Sunday算法,比KMP还要快的字符串匹配。

    假设
    匹配串src(quad)abcabdaababcbab
    模式串des(quad)babcb

    设匹配串的游标为i,模式串游标为j,模式串当前位于匹配串位置pos
    src[i] != des[j]时,看abcabdaababcbab中的d,在模式串中不存在d,所以pos += len(des),变到d后面的a的位置,j=0

    此时:

    abcabdaababcbab

    $ $babcb

    再看c是否存在于des,存在。从右向左找到des中第一个与c匹配的位置,并将des与之对其:

    abcabdaababcbab

    $quadquadquad $babcb

    本例完成匹配。

    Python代码如下:

    def sunday(src, des):
        len_src = len(src)
        len_des = len(des)
        pos = 0
        while pos < len_src - len_des + 1:
            i = pos
            j = 0
            # print src[i:]
            # print des
            for j in range(0, len_des):
                if src[i] != des[j]:
                    if src[pos+len_des] in des:
                        pos += len_des
                        break
                    else:
                        index = des.rfind(src[pos+len_des])
                        pos += (len_des-index)
                        break
                else:
                    i += 1
                    j += 1
            if j == len_des:
                return True
        return False
    
    
    def main():
        src = "abcdaajisdfhcbbasbebbbsaecabbadd"
        des = "bsaeca"
        print sunday(src, des)
    

    其实在Python里有内建的函数搞定字符串匹配:

    print des in src
    
  • 相关阅读:
    airtest支持Cocos-Creator,SDK接入
    Python的getter和setter方法
    liunx常用命令
    liunx的vim常用命令收集
    django+atx+liunx的一些shell脚本
    django+airtest+atx部署liunx平台
    Android下的鉴权实现方案
    Mate20 pro实现H265 (HEVC)实时硬件编码
    OpenCV C++常用功能介绍
    Ubuntu16.04编译libjpeg-turbo库
  • 原文地址:https://www.cnblogs.com/phil-chow/p/5946898.html
Copyright © 2020-2023  润新知