KMP算法

目录

kmp已经整了很多次了,从一开始的不懂到之前一次的似懂非懂,这次再刷字符串算法,一定搞懂

寄,又有点糊里糊涂的

感悟

有点晕,next数组和整体的顺序上已经理解了
存在的问题

  1. 用next数组查找的时候要用while循环去查找,因为如果用if来查找,匹配到本次不一样,回退后仍然可能不一样所以要用while直到一样或者结束

  2. next数组的构建过程中同样要用while做循环检测,然后slowptr=next[slowptr-1]

class Solution {
public:
    int strStr(string haystack, string needle) {
        int n=haystack.length();
        int m=needle.length();
        
        vector<int> next(m,0);
        int slowptr=0;
        int fastptr=1;
        for(;fastptr<m;fastptr++)
        {
            while(slowptr>0&&needle[fastptr]!=needle[slowptr])
            {
                slowptr=next[slowptr-1];
            }
            if(needle[fastptr]==needle[slowptr])
            {
                next[fastptr]=slowptr+1;
                slowptr++;
            }
        }
        for(int i=0,j=0;i<n;i++)
        {
            while(j>0&&haystack[i]!=needle[j])
            {
                j=next[j-1];
            }
            if(haystack[i]==needle[j])
            {
                j++;
            }
            if(j==m)
            {
                return i-m+1;
            }
        }
        
        return -1;
    }
};
posted @ 2024-01-31 11:48  LiviaYu  阅读(8)  评论(0)    收藏  举报