字符串匹配

1.BF匹配

#include"iostream"
using namespace std;
string s,p;
int bf(){
	int i,j;
	i = j = 0;
	int li = s.length();
	int lp = p.length();
	while(i < li && j < lp)
	{
		if(s[i] == p[j])
		{
		//	cout<<s[i];
			i++;
			j++;
		}
		else
		{
			i = i - j + 1; 
			j = 0; 
		} 
	
	 } 
	 	if(j >= lp)
			return i - lp;
		else
			return 0; 
} 
int main()
{
	//cout<<"输入字符串s和p:\n";
	//ababcabcacbab
	//abcac
	s = "ababcabcacbab";
	p = "abcac";
	//int a = bf();
	cout<<bf()+1<<endl; 
 } 

  

2.KMP

(1)数组下标从1开始

#include"iostream"

using namespace std;
int next_k[100];
void getnext_k(string t)
{
	int i,j;
	int len = t.length();
	cout<<"模式串长度:"<<len-1<<endl;
	next_k[1] = 0;
	i = 1;j = 0;
	while(i < len-1)
	{
		if(j == 0 || t[i] == t[j])
			{
				i++;
				j++;
				if(t[i]!=t[j])
					next_k[i] = j;
				else
					next_k[i] = next_k[j]; 
			}
		else
			j = next_k[j];
	}

}
int index_Kmp(string s,string t,int pos)
{
	int i = pos ,j = 1;
	
	while(i <= s.length()-1 && j <= t.length()-1)
	{
		if( j==0 || s[i]==t[j])
			{
				i++;
				j++;
			}
		else
			j = next_k[j];
	}
	if(j > t.length()-1)
		return i - t.length()+1;
	else
		return 0;
}
int main()
{
	string s,p;
	//意第一个位置开始,随意空一格
	s=" ababcabcacbab";
	p=" abcac";
	//cin>>s>>p;
	//p="qaaaab" ; 
	getnext_k(p);
	int index = index_Kmp(s,p,1);
	for(int i=1;i<=p.length()-1;i++)
		cout<<next_k[i]<<endl; 
	cout<<"位置为:"<<index;
} 

  (2)数组下表从0开始

#include"iostream"
#include<cmath>
using namespace std;
int next_k[100];
void getNext(string t)
{
	int len = t.length();
	int i,j;
	next_k[0] = -1;
	i = 0;j = -1;
	while(i < len)
	{
		if(j == -1 || t[i] == t[j])
			{
				i++;
				j++;
				if(t[i]!=t[j])
					next_k[i] = j;
				else
					next_k[i] = next_k[j]; 
			}
		else
			j = next_k[j];
	}

}
int index_Kmp(string s,string t,int pos)
{
	int i = pos ,j = 0;
	int s_len = s.length(),t_len = t.length();
//这里有个小坑,当用j<t.length()直接判断时,当j=-1的话,会判断不出来,而j>=0时可以正常判断.用sizeof(t.length())得到8字节, while(i<s_len&& j<t_len) { if(j == -1 || s[i] == t[j]) { i++; j++; } else j = next_k[j]; // cout<<"s.len="<<s.length()<<",t.len="<<t.length()<<endl; // cout<<"i="<<i<<",j="<<j<<endl; } cout<<"循环结束"; //cout<<"j="<<j<<endl; if(j == t.length()) return i - j; else return -1; } int main() { string s,p; // s="ababcabcacbab"; // p="abcac"; s="aksfygjasfv"; p="asf"; //cin>>s>>p; getNext(p); for(int i=0;i<p.length();i++) cout<<next_k[i]<<endl; int index = index_Kmp(s,p,0); cout<<"位置:"<<index + 1; }

  

posted @ 2020-09-30 23:35  TiSou1  阅读(158)  评论(0)    收藏  举报