【算法与数据结构】字符串模式匹配

语义

在一个很长的字符串 T 中,查找是否存在子字符串 P。例如搜索引擎收录的大量网站数据,当用户输入关键字后,就会在这些数据中进行匹配,并返回合适的网站。

语义:假定字符串长度为 j,则所有字符串都在 [0, j) 这样的集合中。

返回首次匹配的字符的位置。注意这里调用方需要判断位置是否正确,例如对于长度为 i 的字符串,要查找是否有长度为 j 的字符串,如果返回值在 [0, i - j) 则为正确匹配到数据,否则就是失败。

暴力匹配 brute force

每次用 T 的一个字符匹配 pattern 的所有字符,全部匹配成功则返回首字符下标,否则 T 前进一个字符,继续匹配:

#include 
#include 

int match(char *str, char *pattern) {
    int i = 0, j = 0;
    int sLen = strlen(str);
    int pLen = strlen(pattern);
    if (sLen < 1 || pLen < 1) {
        return -1;
    }
    while (i < sLen && j < pLen) {
        if (str[i] == pattern[j]) {
            i++;
            j++;
        } else {
            i = i - j + 1;
            j = 0;
        }
    }
    return i - j;
}

int main(void) {
    char *str = "sfeiwojdsljfldshgew";
    printf("str length is:%ld\n", strlen(str));
    char *pattern[] = {
        "",
        "a",
        "abc",
        "woj",
        "wojdsljflda"
    };
    int i, ret;
    int len = sizeof(pattern) / sizeof(char *);
    for (i = 0; i < len; i++) {
        ret = match(str, pattern[i]);
        printf("ret is:%4d, correct range is:%ld, raw is:%s\n", ret, strlen(str) - strlen(pattern[i]), pattern[i]);
    }

    return 0;
}

KMP

最长前后缀

KMP 算法

你可能感兴趣的:(算法与数据结构)