字符串匹配算法 之 朴素字符串匹配

时间:2023-01-06 22:31:01

前言

字符串匹配问题的形式定义:

  • 文本(Text)是一个长度为 n 的字符串:T;
  • 模式(Pattern)是一个长度为 m 且 m≤n 的字符串:P;

T 和 P 中的元素都属于有限的字母表 Σ 表;

有效位移 (Valid Shift):
如果 0≤ s ≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移。

字符串匹配示意图如下:

字符串匹配算法 之 朴素字符串匹配

比如上图中,目标是找出所有在文本 T = abcabaabcabac 中模式 P = abaa 的所有出现。该模式在此文本中仅出现一次,即在位移 s = 3 处,位移 s = 3 是有效位移。

本文介绍的是字符串匹配最简单的算法——朴素字符串匹配算法。该算法的原理非常简单,就是通过一个循环找到所有有效偏移,即对检查是否满足条件。算法没有进行预处理,只是对其进行匹配处理。

算法原理

算法复杂度

  • 时间复杂度

    时间复杂度是非常大: O((n-m+1)m)

  • 空间复杂度

    空间复杂度:O(m+n)

Python实现

# -*- coding: utf-8 -*-

def nativeStringMatcher(t, p):
    ''' :param t: the string to check :param p: pattern '''
    n = len(t)
    m = len(p)
    for s in xrange(0, n-m+1):
        if p == t[s:s+m]:
            print 'Pattern occurs with shift %d' % s
if __name__ == '__main__':
    t = "CGTCGATCGCGCTACGTCGACGTACGGCAGCCAGCGACGTCGCTTTCACGACGTCGTCAGCACCGTCGGATCCGTCG"
    p = "CGTCG"
    nativeStringMatcher(t,p)

算法测试

执行完的结果如下:

Pattern occurs with shift 0
Pattern occurs with shift 14
Pattern occurs with shift 37
Pattern occurs with shift 51
Pattern occurs with shift 63
Pattern occurs with shift 72

总结

朴素字符串匹配是遍历一遍文本字符串,对于短文本还可以接受,如果文本过长或者模式串比较多,那就很麻烦了。

参考