zoukankan      html  css  js  c++  java
  • 字符串匹配算法——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
    
  • 相关阅读:
    10 个迅速提升你 Git 水平的提示
    GitLab-CI与GitLab-Runner
    WEB应用安全解决方案测试验证
    sparse representation 与sparse coding 的区别的观点
    The Ph.D. Grind
    Potential Pythonic Pitfalls
    Overfitting & Regularization
    LVM的一般操作过程
    你跟大牛之间仅仅差一个google
    Hadoop伪分布式模式部署
  • 原文地址:https://www.cnblogs.com/phil-chow/p/5946898.html
Copyright © 2011-2022 走看看