字符串的查找的3种方法

  • Post author:
  • Post category:其他




KMP

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
const int N = 1e5 + 10, M = 1e6 + 10;
char s[M],p[N];
int ne[M];
int main()
{
    int n,m;
    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)
        {
            cout<<i - n<<' ';
            j = ne[j];
        }
    }
    
    
}


ne[j]存的是对于模板串p,当前最大后缀与前缀相等的长度,有了这个长度,可以在s[i] != p[j + 1]时,让p串前面保留的信息尽量的多



推荐下标从1开始写,因为这样ne数组里面

存的长度就是下次返回的下标




strstr(s, p)库函数(必须是char[])




s

中有

p

则返回第一次出现的

地址

,否则返回

NULL

char str[100] = "abcdefg";
char p[100] = "deq";
if(strstr(str,p))
{
	int pos = strstr(str, p ) - str;
	cout<<pos<<endl;
}



string 里面的 find()函数


存在返回

位置

,不存在返回

s.npos

	string s = "abcdefg";
	string p = "bcd";
	if(s.find(p) != s.npos)
	{
		int pos = s.find(p);
		cout<<pos<<endl;
	}
	else cout<<"no";



版权声明:本文为xxxxian666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。