字符串-实现strStr-KMP问题

找出字符串中第一个匹配项的下标。

KMP思想:寻找匹配的字符串,记录一部分之前匹配过的内容(前缀表),当匹配不成功时,避免从头开始重新匹配,节省时间。

获取前缀表(prefix table, 不向右移动,不全体减一):

字符串下标:0 1 2 3 4 5

字符串:       a a b a a f

next(前缀表):0 1 0 1 2 0

i指向后缀的最后一个字符,j指向前缀的最后一个字符;

i = 1; j = 0; j++; next[i] = j; next[1] = 1;

i = 2; j = 1; j = next[j -1](回退); j = 0; next[2] = 0;

i = 3; j = 0; j++; next[3] = 1;

i = 4; j = 1; j++; next[4] = 2;

i = 5; j = 2; j = next[j -1]; j = 1; next[5] = 1????

啊啊啊啊啊啊啊啊啊啊,我需要再看几遍。他妈的没完全搞懂。

void getNext(int* next, const string& s) { //获取前缀表
    // 1.初始化
    int j = 0; // i指向字符串后缀的最后一个字符,j指向字符串前缀的最后一个字符 
    next[0] = 0;

    //
    for (int i = 1; i < s.size(); i++)// i从1开始
    {
        // 2.当i和j不匹配时,回退一位,看next数组中的前一位(连续的过程,使用的是while而非if)
        while (j > 0 && s[i] != s[j]) {// j>0,因为下面有取j-1位置的数组下标元素
            j = next[j - 1];// 找前一个位置进行回退
        }
        // 3.当i和j匹配的时候
        if (s[i] == s[j]) { 
            j++;
        }
        // 4.更新next数组的值
        next[i] = j;
    }
}

int strStr(string haystack, string needle) {
    if (needle.size() == 0)//如果待匹配的字符串长度为0
    {
        return 0;
    }
    int next[needle.size()];
    getNext(next, needle);
    int j = 0;
    for (int i = 0; i < haystack.size(); i++)
    {
        while (j > 0 && haystack[i] != needle[j]) {
            j = next[j - 1];
        }
        if (haystack[i] == needle[j])
        {
            j++;
        }
        if (j == needle.size())
        {
            return(i + 1 - needle.size());
        }
    }
    return -1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值