KMP字符串匹配算法代码(模板)
发布日期:2021-05-10 18:39:24 浏览次数:15 分类:精选文章

本文共 2893 字,大约阅读时间需要 9 分钟。

KMP���������������������������������

������������KMP������������������������������������������������������������������������������������������������������������������������������������������������������������

KMP������������������������������������������������next������������������������������������������������������������������������������������������������������������������������next���������������������������

void get_next(char* p) {
int len = strlen(p);
next[0] = -1;
int k = -1, j = 0;
while (j < len - 1) {
if (k == -1 || p[k] == p[j]) {
k++;
j++;
next[j] = k;
} else {
k = next[k];
}
}
}

������������������������������������������������������������������������������

  • ������������������������������p���������len���
  • ���������next[0]���-1���������������������������������������
  • ���������������k���������������������j���������������������
  • ������������������������������������������������������
  • ������k���������������������������������������-1���������������������������p[k]���������������������������k���j���
  • ���������������������������������������next[j]���
  • ������������������������������k���������������������������������
  • ������������������������������

    int kmp(char* s, char* p) {
    int s_len = strlen(s);
    int p_len = strlen(p);
    int i = 0, j = 0;
    while (i < s_len && j < p_len) {
    if (j == -1 || s[i] == p[j]) {
    j++;
    i++;
    } else {
    j = next[j];
    }
    }
    return j >= p_len ? i - j : -1;
    }

    ���������������������������������������������

  • ���������������������i���������������������������j������������������������
  • ������������������������
    • ������j���������������������-1���������������������������
    • ������������������������j���i���������������
    • ���������������������next[j]���j���������������������������������
  • ���j������������������������p_len���������������������������
  • ���������������������������
    • ���������������������������i - j������������������������������
    • ���������������-1������������������

    ������������������������������������

    ���������������������abcabc���������abc���������������������next������������������������

    next[0] = -1,
    next[1] = 0,
    next[2] = 0,
    ...

    ���������������������������������������������������������������������

    ������main���������������������

    int main() {
    char str[] = "bbc abcdab abcdabd";
    char pat[] = "abcdabd";
    int len_pat = strlen(pat);
    get_next(pat);
    cout << "���������: ";
    int ret = kmp(str, pat);
    cout << ret << endl;
    }

    ������������get_next(pat)���������pat���������next���������kmp(str, pat)���������������������������0������������������

    ���������������������������������������������������������KMP������������������������������������������������������������������������������

    ���������������vala������������������������������������������������������������

    上一篇:Transformer注意力机制笔记
    下一篇:力扣 1658. 将 x 减到 0 的最小操作数

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月08日 21时52分44秒