字符串匹配代码

来源:互联网 发布:hello聊天软件下载 编辑:程序博客网 时间:2024/05/17 22:17
std::vector<int> ViolentMatch(char *s, char *p)
{
    int sLen = strlen(s);
    int pLen = strlen(p);


    int i = 0;
    int j = 0;


    std::vector<int> vSize;




    while(i < sLen)
    {
        while(i < sLen && j < pLen)
        {
            if (s[i] == p[j])
            {
                i++;j++;
            }
            else
            {
                i = i - j + 1;
                j = 0;
            }
        }
        if (j == pLen)
        {
            vSize.push_back(i-j);
            i = i-j+1;
            j = 0;
        }
        else
        {
            return vSize;
        }
    }


    return vSize;
}






void GetNextval(char* p, int next[])  
{  
    int pLen = strlen(p);  
    next[0] = -1;  
    int k = -1;  
    int j = 0;  
    
    while (j < pLen - 1)  
    {  
        //p[k]表示前缀,p[j]表示后缀    
        if (k == -1 || p[j] == p[k])  
        {  
            ++j;  
            ++k;  
            //较之前next数组求法,改动在下面4行  
            if (p[j] != p[k])  
                next[j] = k;   //之前只有这一行  
            else  
                //因为不能出现p[j] = p[ next[j ]],所以当出现时需要继续递归,k = next[k] = next[next[k]]  
                next[j] = next[k];  
        }  
        else  
        {  
            k = next[k];  
        }  
    }  
}  


std::vector<int> KmpSearch(char* s, char* p, int next[])  
{  
    int i = 0;  
    int j = 0;  
    int sLen = strlen(s);  
    int pLen = strlen(p);  
    std::vector<int> vecIndex;
    while(i < sLen)
    {
        while (i < sLen && j < pLen)  
        {  
            //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++      
            if (j == -1 || s[i] == p[j])  
            {  
                i++;  
                j++;  
            }  
            else  
            {  
                //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]      
                //next[j]即为j所对应的next值        
                j = next[j];  
            }  
        }  
        if (j == pLen)  
        {
            vecIndex.push_back(i-j);
            i = i - j+1;
            j = 0;
        }
        else  
        {
            return vecIndex;
        }
    }
    

}


优化前:

  1. void GetNext(char* p,int next[])  
  2. {  
  3.     int pLen = strlen(p);  
  4.     next[0] = -1;  
  5.     int k = -1;  
  6.     int j = 0;  
  7.     while (j < pLen - 1)  
  8.     {  
  9.         //p[k]表示前缀,p[j]表示后缀  
  10.         if (k == -1 || p[j] == p[k])   
  11.         {  
  12.             ++k;  
  13.             ++j;  
  14.             next[j] = k;  
  15.         }  
  16.         else   
  17.         {  
  18.             k = next[k];  
  19.         }  
  20.     }  
  21. }  

0 0
原创粉丝点击