前言
字符串匹配问题的形式定义:
- 文本(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
总结
朴素字符串匹配是遍历一遍文本字符串,对于短文本还可以接受,如果文本过长或者模式串比较多,那就很麻烦了。