1. 程式人生 > 其它 >字串匹配——BM演算法(C/C++)

字串匹配——BM演算法(C/C++)

字串匹配——BM演算法(C/C++)

BM演算法: 壞字元與好字尾。

BM演算法壞字元

描述:從右往左遍歷,找到第一個不同的位置,然後查詢模式串中第一個與該位置相同的字元,然後將兩個位置對齊。

如果後面有已經匹配的部分子串,則查詢模式串前是否有已經匹配的部分子串,若找到則對齊這匹配的子串。

極端情況,壞字元一直出現在結尾。好結尾一直不出現!退化為暴力搜尋。

程式語言描述:

int BMstring_BC(char *S, char *T){
    int lenT = strlen(T);
    int lenS = strlen(S);
    int i,j,k;
    for(i=0;i<lenS;){
        for(j=lenT-1,k=0;j>=0;j--)
            if(T[j]!=S[i+j])
                break;
        if(j==-1)
            return i;
        for(k=j;k>=0;k--)
            if(T[k] == S[i+k])
                break;
        i += j-k;
    }
    return -1;
}

BM演算法——好字尾

描述:從右往左匹配,找到壞字元(意味著壞字元後面的串是匹配的,即該串為好字尾),往左尋找模式串中是否還存在好字尾,若有,將模式串右移到該位置與主串的好字尾對齊。

若模式串中再沒有好字尾,則右移到好字尾的往右錯一位的位置。

程式描述:

int BMstring_GG(char *S, char *T){
    int lenT = strlen(T);
    int lenS = strlen(S);
    int i,j,k;
    for(i=0;i<lenS;){
        for(j=lenT-1,k=0;j>=0;j--)
            if(T[j] != S[i+j])
                break;
        if(j==-1)
            return i;
        char demo[lenT-j];
        for(int t=j;t>=0;t--)
            demo[j-t] = T[t];
        k = BMstring_GG(T, T+j);
        if(k == 0){
            i += lenT-j;
            continue;
        }
        i += j-k+1;        
    }
    return -1;
}