串的模式匹配算法

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值