public class Pattern_KMP {
public static void main(String args[])
{
int times;
String source="abcabaabcabcabxxzhabaabcabcabxad";
String subStr="abcabx";
times=pattren_KMP(source, subStr);
System.out.println("匹配次数:"+times);
}
static int pattren_KMP(String source,String subStr)
{
int len1,len2;
len1=source.length();
len2=subStr.length();
int i,j;
i=j=0;
int times=0;
while(i<len1)
{
if(source.charAt(i)==subStr.charAt(j))
{
i++;
j++;
}else
{
if(j==0)/*这一步很重要,如果没有会进入死循环,也就是,如果主串某位与子串*/
i++;/*第一位不等的话,必须往后移位。*/
j=next(subStr,j);
}
if(j==len2)
{
times++;
j=0;
}
}
return times;
}
static int next(String subStr,int j)
{
if(j==0)
return 0;
else {
int next=0;
int k=1;
int m1;
int m2;
int i,n;
/*这一循环对应实现上面函数的第二项*/
while(k<j)
{
String sub1="",sub2="";
for(m1=0,m2=j-k;m1<k&&m2<j;m1++,m2++)
{
sub1+=subStr.charAt(m1);
sub2+=subStr.charAt(m2);
}
for(i=0,n=0;i<sub1.length()&&n<sub2.length();i++,n++)
{
if(sub1.charAt(i)!=sub2.charAt(n))
break;
}
if(i==sub1.length()&&n==sub2.length())
next=k;
k++;
}
return next;
}
}
}
/* 通过计算返回子串T的next数组。 */
void get_next(String T, int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while (i<T[0]) /* 此处T[0]表示串T的长度 */
{
if(j==0 || T[i]== T[j]) /* T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 */
{
++i;
++j;
next[i] = j;
}
else
j= next[j]; /* 若字符不相同,则j值回溯 */
}
}
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* T非空,1≤pos≤StrLength(S)。 */
int Index_KMP(String S, String T, int pos)
{
int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
int j = 1; /* j用于子串T中当前位置下标值 */
int next[255]; /* 定义一next数组 */
get_next(T, next); /* 对串T作分析,得到next数组 */
while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
{
if (j==0 || S[i] == T[j]) /* 两字母相等则继续,与朴素算法增加了j=0判断 */
{
++i;
++j;
}
else /* 指针后退重新开始匹配 */
j = next[j];/* j退回合适的位置,i值不变 */
}
if (j > T[0])
return i-T[0];
else
return 0;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有