KMP算法小总结 洛谷P3375 【模板】KMP字符串匹配

  • 提问:这里有一个长度为n的字符串str1和长度为m的字符串str2(n > = m),问在str1中str2出现了几次?

  • 如果使用暴力求解,一个一个比较,在n和m都极大的情况下将花费非常多的不必要的计算,那么我们有什么办法来解决呢?

  • 思路:如果我们比较了x个字符都相等,第x + 1个字符不相等,我们没必要回到一开始重新比较,因为前x个字符都已知,只要知道这x个字符能对上str2的前y个字符,再让str1的第x + 1个字符与str2的第y + 1个子符继续比较即可。

  • 例题洛谷P3375 【模板】KMP字符串匹配
  • 代码:
    #include
    using namespace std;
    const int MAXN = 1e6 + 10;
    int nex[MAXN];
    void fnex(string str)
    {
    	nex[0] = -1;
    	int ptop = -1;
    	int i = 0;
    	int end = str.size();
    	while(i < end)
    	{
    		if(ptop == -1 || str[i] == str[ptop])
    		{
    			nex[++i] = ++ptop;
    		}
    		else
    		{
    			ptop = nex[ptop];
    		}
    	}
    }
    int main()
    {
    	string str1,str2;cin >> str1 >> str2;
    	int end = str1.size();
    	fnex(str2);
    	int i = 0;
    	int ptop = 0;
    	int sum = 0;
    	int end2 = str2.size();
    	while(i < end)
    	{
    		if(ptop == end2)
    		{
    			cout << i - end2 + 1 << endl;
    			ptop = nex[ptop];
    		}
    		if(ptop == -1 || str1[i] == str2[ptop])
    		{
    			i++;
    			ptop++;
    		}
    		else
    		{
    			ptop = nex[ptop];
    		}
    	}
    	if(ptop == end2)
    	{
    		cout << i - end2 + 1 << endl;
    		ptop = nex[ptop];
    	}
    	for(int i = 1;i <= end2;i++)
    	{
    		cout << nex[i] << ' ';
    	}
    }

你可能感兴趣的:(算法,c++,开发语言)