悟已往之不谏,知来者之可追

第五章、字符串

第五章、字符串

一、串的模式匹配算法:

  1、Brute-Force模式匹配算法:

        是对主串和模式串的遍历匹配。

        时间复杂度理论上在o(m*n),通常情况下,实际运行过程中,该算法的执行时间近似于o(m+n)

#include<stdio.h>
struct String{
    char a[20];
    int length;
};
int indexstring(String s,String t,int pos=1){
    char *p,*q;
    int k,j;
    k=pos-1;
    j=0;
    p=s.a+pos-1;
    q=t.a;
    while ((k<s.length)&&(j<t.length))
    { 
        if(*p==*q) {
            //如果匹配,就一直前进
            p++;q++;k++;j++;
        }else{
            //如果不匹配,主串向前移j-1个,模式串移到开头,这就是最浪费时间的地方,kmp算法在这里改进
            k=k-j+1;j=0;q=t.a;
            p=s.a+k;
        }
    }
    if(j==t.length){
        return(k-t.length);
    }else
        return (-1);
}
int main(){
    String s;
    scanf("%s",s.a);
    String t;
    scanf("%s",t.a);
    int i=0;
    for(;s.a[i];i++);
    s.length=i;
    int j=0;
    for(;t.a[j];j++);
    t.length=j;
    printf("%d\n",indexstring(s,t));
}  

 

 

 

  2、即kmp算法,可以在0(m+n)的时间数量级上完成串的模式匹配操作。

      其思想是每当一趟匹配过程中出现字符不相等时,主串显示器不用回溯,而是利用已经得到的“部分匹配”结果,将模式串的指示器向右“滑动”尽可能远的一段距离后,继续进行比较。
这个解释比较详细

     

 

posted @ 2018-04-11 21:32  monty1  阅读(79)  评论(0)    收藏  举报