字符串匹配算法——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

$\quad\quad\quad\ $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
posted @ 2016-10-10 18:34  phil_chow  阅读(577)  评论(0编辑  收藏  举报