「AcWing学习记录」KMP

AcWing 831. KMP字符串

原题链接

1.暴力算法怎么做

char s[N], p[M];
for(int i = 1; i + m - 1 <= n; i++)
{
    bool flag = true;
    for(int j = 1; j <= m; j++)
        if(s[i + j - 1] != p[j])
        {
            flag = false;
            break;
        }
}

2.如何去优化
时间复杂度O(n)
image

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10, M = 1e6 + 10;

int n, m;
char s[M], p[N];
int ne[N];

int main()
{
    cin >> n >> p + 1 >> m >> s + 1;

    for(int i = 2, j = 0; i <= n; i++)
    {
        while(j && p[i] != p[j + 1]) j = ne[j];
        if(p[i] == p[j + 1]) j++;
        ne[i] = j;
    }

    for(int i = 1, j = 0; i <= m; i++)
    {
        while(j && s[i] != p[j + 1]) j = ne[j];
        if(s[i] == p[j + 1]) j++;
        if(j == n)
        {
            printf("%d ", i - n);
            j = ne[j];
        }
    }

    return 0;
}
posted @   恺雯  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示