Kmp 不知道想法对不对,请大佬斧正

本文探讨了KMP算法的基本思想,分析了匹配串的子串与其子串之间的关系,并详细解释了如何构建前缀表和实现字符串匹配过程。通过三个子串类别,阐述了在匹配过程中如何利用已匹配信息进行回退,最后给出了KMP算法的Java实现代码。
摘要由CSDN通过智能技术生成

分析匹配串的子串与子串的子串之间的关系,例如aabcbcaab(长度为9)
其子串abcbcaab的前缀子串:
a,ab,abc,abcb,abcbc,abcbca,abcbcaa,abcbcaab//
另一类子串2:
a、aa,aab,aabc,aabcb,aabcbc,aabcbca,aabcbcaa,aabcbcaab//是做为匹配串的开头
还有一类子串3:
aabcbcaab, abcbcaab,  bcbcaab, cbcaab, bcaab,  caab, aab,  ab,  b,//是作为匹配串的结尾
假定子串2中的某个是已匹配的串,那么
从最长的匹配串尾开始将他和匹配串头子串匹配,没匹配上,依次换比它小的匹配串来匹配。如果匹配上,那回退量为已匹配串的长度减匹配串尾;

实现:
子串1:
String str1[]=new String(i);
for(int i=0;i<needle.length;i++)
{str1[i]=strcat(needle,1,i);}
子串2:
Sring str2[]=new String(i);
for(int i=0;i<needle.length;i++)
{str2[i]=strcat(needle,0,i);}
子串3:
String str3[]=new String(i);
for(int i=needle.length,i>=0;i--)
{str3[i]=strcat(needle,i,nedle.length);}
回退量:
int [] back(String needle){
int k =0//记录为匹配串开头的子串与为匹配串结尾的子串匹配时最佳匹配串的位置
int l[]=new Int(needle.length);
for(int i;i<needle.length;i++) l[i]=0;
for(int i;i<needle.length;i++)
      for(int j=i;j<i;j++)
{
{
     if(strcmp(str2[i]==str3[j])) k=j+1;

}
l[i]=k;
}
return I;
}

strStr()函数实现:
int strStr(String haystack,String needle){
if(hayStack.length==0) return 0;
if (needle.length==0) return 0;
if(needle.length>haystack.length) return -1;
int[] backNumber=new Int(needle.length);
backNumber=back(needle);
int j=0;int b=0;//b 用于记录回退量
for (int i=0;i<haystack.length;i++)
{
if(strcmp(needle[j],haystack[i])==0) j++;
else if(j==0) ;
else if(j>needle.length) return i-j+1;
else{

    i=i-backNumber[j-1]-1;
j=backNumber; 

}
return -1;
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值