KMP_??_!!!_~~

约定 txt 是 主字符串 ,pat 是 模式串;

假设 pat = "ABABABC" ; txt="ABAABBABABABCA";

`ABABABABABABCA

  `ABABABC

    `ABABABC

      `ABABABC

        ...........

依次对其并且依次比较 TLE 了;so 需要 improve ~

ABABABABABABCA

     ABABABC
                    |

如果在 | 这个位置比较的话 那么

ABABABABABABCA

          ABABABC
                         |
pat可以往后移动2单位  优化了诶~ //  向后移动所能移动的max位移,,

所以我们要做的就是

get 一个 next[] 来确定

在pat 第 i 位匹配不成功的话

需要 从第pat の 第 next[i] 位置 重新匹配        

        · getnext(string pat)代码实现:

int* getnext(string pat)
{
    int *next=new int [pat.length()];
    next[0]=-1;
    int i=0,k=-1;
    while(i<pat.length())
    {
  		if(k==-1||pat[i]==pat[k])
  		{
  			k++;
  			next[++i]=k;
  		}
  		else
  			k=next[k];// 需要 从第pat の 第 next[i] 位置 重新匹配  
    }
    for(int i=0;i<pat.length();i++)
    {
    	cout<<next[i]<<" ";
    }
    return next;
}

在得知

在pat 第 i 位匹配不成功的话

需要 从第pat の 第 next[i] 位置 重新匹配  

之后就可以开始匹配txt了

int KMP(string txt,string pat)
{
	int *next=getnext(pat);
	int i=0;
	int j=0;
	while(i<txt.length()&& j<pat.length())
	{
		if(j==-1||pat[j]==txt[i])
		{
			j++;i++;
		}
		else
			j=next[j];
	}
	if(j>=pat.length())
	{
		cout<<"在txt中找到了pat!!"<<endl;
		cout<<"位置是"<<i-pat.length()<<endl;
	}
}

KMP完成:

完整代码测试-》

#include<iostream>
using namespace std;
int* getnext(string pat)
{
    int *next=new int [pat.length()];
    next[0]=-1;
    int i=0,k=-1;
    while(i<pat.length())
    {
  		if(k==-1||pat[i]==pat[k])
  		{
  			k++;
  			next[++i]=k;
  		}
  		else
  			k=next[k];
    }
    for(int i=0;i<pat.length();i++)
    {
    	//cout<<next[i]<<" ";
    }
    return next;
}
int KMP(string txt,string pat)
{
	int *next=getnext(pat);
	int i=0;
	int j=0;
	while(i<txt.length()&& j<pat.length())
	{
		if(j==-1||pat[j]==txt[i])
		{
			j++;i++;
		}
		else
			j=next[j];
	}
	if(j>=pat.length())
	{
		cout<<"在txt中找到了pat!!"<<endl;
		cout<<"位置是"<<i-pat.length()<<endl;
	}
}
int main()
{
    KMP("ABABABABABABCA","ABABABC");
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值