字串匹配——BM演算法(C/C++)
阿新 • • 發佈:2022-03-26
字串匹配——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; }