串的模式匹配问题

有三种方法

1、直接匹配               2、首尾匹配                        3、KMP算法

(1) 前两种算法时间复杂度为O(M*N);后一种为O(m+n)

(2)算法1实际执行时间近似O(m+n),KMP算法只有模式串与主串之间有很多部分匹配的情况下才显得高效。

   但是KMP算法的优点在于主串指针不回溯,对处理从外设输入的庞大数据文件很有效,可以边读入边匹配,无需回头重读。

1、直接匹配法  

int index(SString S, SString T, int pos)
{
    i=pos; j=1;
    while(i<=S[0]||j<=T[0])
    {
        if(S[i]==T[j])    {i++;    j++;}
        else 
            {i=i-j+2;  j=1;}
    }
    if(j>T[0])    return i-j+1;
    else
        return 0;
}
//注:此处T[0]意为字符串T的长度,实际数据从T[1]开始

 

2、首尾匹配

int index(SString S, SString T, int pos)
{
    sLength=S[0];    tLength=T[0];   
    i=pos; 
    while(i<=sLength-tLength+1)
    {
        if(S[i]!=S[1])    ++i;
        else if(S[i+tLength-1]!=T[tLength])    ++i; 
        else
        {
             k=1;j=2;    
             while(j

 3、KMP算法

int index(SString S, SString T, int pos)
{
    i=pos; j=1;
    while(i<=S[0]||j<=T[0])
    {
        if(S[i]==T[j])    {i++;    j++;}
        else 
           j = next[j];    
    }
    if(j>T[0])    return i-j+1;
    else
        return 0;
}

void get_next(SString T, int next[])  
{
    i=1; next[1]=0; j=0;
    while(i

 

 

 

 

转载于:https://www.cnblogs.com/CanWork/archive/2012/11/27/2791417.html

你可能感兴趣的:(串的模式匹配问题)