字符串匹配算法——暴力算法

字符串匹配算法——暴力算法,简称 B F ( B r u t e   F o r c e ) BF(Brute\:Force) BF(BruteForce)算法。

基本思想:从主串 ( s t r ) (str) (str)的第一个字符开始和子串 ( p a t t e r n ) (pattern) (pattern)的第一个字符进行比较,若相等,则继续比较;否则子串退回第一个字符,重新和主串的第二个字符进行比较。反复如此,直到主串完毕。

string str, pattern;//主串和模式串

void brute_force() {
    int len1 = str.length();
    int len2 = pattern.length();
    int i, j;
    for (i = 0; i < len1 - len2 + 1; i++) {
        for (j = 0; j < len2; j++) {
            if (str[i + j] != pattern[j]) break;//若不匹配,就把pattern向后移动一位
        }
        if (j == len2) cout << i << " ";//若到达pattern的结尾,则成功
    }
}

时间复杂度: O ( n m ) O(nm) O(nm)

看个例子,对文本 s t r = a b a b a a a b a b a a str=ababaaababaa str=ababaaababaa和模式 p a t t e r n = a a a b pattern=aaab pattern=aaab执行暴力算法。

a b a a b a a a b a b a a a a ‾ a b    a ‾ a a b      a a a ‾ b        a a ‾ a b          a ‾ a a b            a a a b ‾ abaabaaababaa\\ \underline{aa}ab\\ \:\:\underline{a}aab\\ \:\:\:\:\underline{aaa}b\\ \:\:\:\:\:\:\underline{aa}ab\\ \:\:\:\:\:\:\:\:\underline{a}aab\\ \:\:\:\:\:\:\:\:\:\:\underline{aaab} abaabaaababaaaaabaaabaaabaaabaaabaaab

比较 s t r str str p a t t e r n pattern pattern中对应字符,如 p a t t e r n pattern pattern中带下划线的字符,从 p a t t e r n pattern pattern s t r str str对齐位置开始。遇到不匹配的字符之后, s t r str str p a t t e r n pattern pattern的匹配失败,然后把 p a t t e r n pattern pattern向后移动一位,重新开始匹配。注意在实际的操作中并没有真实的移位操作,该操作是通过改变 p a t t e r n pattern pattern的下标实现的。

你可能感兴趣的:(字符串,算法)