字符串匹配之暴力匹配
字符串匹配就是在一個字符串集裏面找到某個模式串出現的所有位置。
例如,找出模式 在文本 中的位置,用 和 分別表示 和 的長度, 表示當字符串匹配時的有效偏移。
暴力匹配的方法是通過循環,找出所有的有效偏移 ,該循環對每一個可能的 進行檢測,看是否滿足條件 。
這種匹配方式可以看做是 字符串在一格一格的滑動,每滑到一個新的位置,需要重新從字符串 頭部開始匹配,檢查與 文本對應的位置是否相等
代碼;
void NaiveSearch(const char* T,const char* P)
{
int n = strlen(T);
int m = strlen(P);
for (int s = 0; s < n - m+1; ++s)
{
int i = s, j = 0;
for (;j < m-1;)
{
if (T[i] == P[j]) ++i, ++j;
else break;
}
if (T[i] == P[j])
printf("%d\n",s);
}
}
上述代碼中,第5行的for循環檢查了每一個可能的偏移值 ,第8~12行檢查了偏移後對應的兩個串是否相等,第14行打印出每個合格的偏移量 。
暴力匹配在最壞的情況下運行時間爲 ,簡化爲 ,例如在 裏面查找 ,每一次滑動都要完全比較 裏面的字符 ,做了很多重複的動作,效率很低。
參考資料:《算法導論》