【考研真题】KMP模式匹配

【2015年计算机联考真题】

已知字符串S="abaabaabacacaabaabcc",模式串t="abaabc"。采用KMP算法进行匹配,第一次出现失配(s[i] ≠ t[j])时,

i=j=5,则下次开始匹配时,i,j的值分别是()

A. i=1,j=0

B. i=5,j=0

C. i=5,j=2

D. i=6,j=2

 

【答案】 C

【解析】

KMP算法主要是求next数组的过程,首先要理解next数组是啥

next[i] 代表什么:next[i] 代表在模式串t中 长度为i的 前缀后缀匹配长度

根据next数组生成算法可得

字符串下标   0 1 2 3 4 5
字符串t   a b a a b c
next 0 0 0 1 1 2 0
next数组下标(j) 0 1 2 3 4 5 6

明显有next[j](j=5)=2,所以所以下一次的j=2。而i每次是不减的,所以i=5。

 

next数组求解 参考KMP算法详解

若悟此图,则悟KMP

 

想撸代码的同学可以选择刷LeetCode 28题 Strstr

下面放上本题KMP算法代码

class Solution {
public:
    int* gen_next(string s)
	{
		int *next = new int[s.size()+1];
		int i = 1, j = 0;
		next[0] = next[1] = 0;
		while (i < s.size())
		{
			while (j>0 && s[i] != s[j])
			{
				//cout << "j=next[" << j << "]" << "=" << next[j]<<"   ";
				j = next[j];
			}
			if (s[i] == s[j]) j++;
			next[i + 1] = j;
			//cout << "next[" << i + 1 << "]" << "=" << j << endl;
			i++;
		}
		return next;
	}
    int strStr(string haystack, string needle) {
        if(needle.empty()) return 0;
        if(haystack.empty()) return -1;
        int *next = gen_next(needle);
		int j = 0, i = 0;
		while (i < haystack.length())
		{
			while (j>0 && haystack[i] != needle[j])
			{
				j = next[j];
			}
			if (haystack[i] == needle[j]) j++;
			if (j == needle.length())
				return i-j+1;

			i++;
		}
		return -1;
    }
};

 

你可能感兴趣的:(note)