字符串匹配的算法(暴力算法和KMP算法)

bgn4 9年前發布 | 920 次閱讀 C/C++ 算法

    #include<iostream>

#include<string>  
using namespace std;  
int KMPfind(char* s, char* p);  
void GetNext(char* p, int next[]);  
int ViolentMatch(char* s, char* p);  
int main()  
{  
    char s1[] = "abcaabbaacaadaabbaa";  
    char s2[] = "aadaab";  
    cout << "In the string " << s1 << ", the string " << s2 << " is started at the "  
        << ViolentMatch(s1, s2);  
    cout << endl<<KMPfind(s1, s2)<<endl;  
    return 0;  
}  
void GetNext(char* p, int next[])  
{  
    int pLen = strlen(p);  
    int i = -1; int j = 0;//i從-1開始,讓不匹配的回溯到開始位置進行匹配  
    next[0] = -1;//  
    for (; j < pLen-1;)  
    {  
        if (i==-1||p[i] == p[j])  
        {  
            ++i; ++j; next[j] = i;  
        }  
        else  
            i = next[i];//i回溯到next[i]的位置  
    }  

}  
int KMPfind(char* s, char* p)  
{  
    int i = 0;  
    int j = 0;  
    int sLen = strlen(s);  
    int pLen = strlen(p);  
    int * next = new int[strlen(p)];  
    GetNext( p,  next);  
    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 = next[j];  
        }  
    }  
    delete []next;  
    if (j == pLen)//比較完畢而且比較了模式字符串的長度表示找到匹配字符串  
        return i - j;  
    else  
        return -1;  
}  
int ViolentMatch(char* s, char* p)  
{  
    int sLen = strlen(s);  
    int pLen = strlen(p);  

    int i = 0;  
    int j = 0;  
    while (i < sLen && j < pLen)  
    {  
        if (s[i] == p[j])  
        {  
            //①如果當前字符匹配成功(即S[i] == P[j]),則i++,j++        
            i++;  
            j++;  
        }  
        else  
        {  
            //②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0        
            i = i - j + 1;  
            j = 0;  
        }  
    }  
    //匹配成功,返回模式串p在文本串s中的位置,否則返回-1    
    if (j == pLen)  
        return i - j;  
    else  
        return -1;  
}  </pre> 


 本文由用戶 bgn4 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!