串的模式匹配算法

1、Brute-Force模式匹配算法(暴力匹配)
如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有:
如果当前字符匹配成功(即S[i] == P[j]),则i++,j++,继续匹配下一个字符;
如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0。相当于每次匹配失败时,i 回溯,j 被置为0。

int IndexString(StringType s , StringType t , int pos )
/* 采用顺序存储方式存储主串s和模式t, */
/* 若模式t在主串s中从第pos位置开始有匹配的子串, */
/* 返回位置,否则返回-1 */
{
    char *p , *q ;
    int k , j ;
    k=pos-1 ; j=0 ; p=s.str+pos-1 ; q=t.str ;
    /* 初始匹配位置设置 */
    /* 顺序存放时第pos位置的下标值为pos-1 */
    while (k<s.length)&&(j<t.length)
    { 
        if (*p==*q) { p++ ; q++ ; k++ ; j++ ; }
        else { k=k-j+1 ; j=0 ; q=t.str ; p=s.str+k ; }
        /* 重新设置匹配位置 */
    }
    if (j==t.length)
        return(k-t.length) ; / * 匹配,返回位置 */
    else 
        return(-1) ; /* 不匹配,返回-1 */
}
//该算法的时间复杂度为O(n*m) ,其中n 、 m分别是主串和模式串的长度。

2、KMP算法(改进)
Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP算法”,常用于在一个文本串S内查找一个模式串P 的出现位置,这个算法由Donald Knuth、Vaughan Pratt、James H. Morris三人于1977年联合发表,故取这3人的姓氏命名此算法。

 下面先直接给出KMP的算法流程(如果感到一点点不适,没关系,坚持下,稍后会有具体步骤及解释,越往后看越会柳暗花明☺):
  1. 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
    如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
    如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。
    换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值(next 数组的求解会在下文的3.3.3节中详细阐述),即移动的实际位数为:j - next[j],且此值大于等于1。

你可能感兴趣的:(串的模式匹配算法)