boyer moore算法 java_Boyer-Moore算法java实现详解

import java.util.*;

public class BoyerMoore {

public static void main(String[] args) {

String text="中国是一个伟大的国度;伟大的祖国啊";

String pattern="伟大的国度";

BoyerMoore bm=new BoyerMoore();

bm.boyerMoore(pattern, text);

}

private void preBmBc(String pattern,int patLength,Map bmBc)

{

System.out.println("bmbc start process...");

for(int i=patLength-2;i>=0;i--)

{

if(!bmBc.containsKey(String.valueOf(pattern.charAt(i))))

{

bmBc.put(String.valueOf(pattern.charAt(i)),(Integer)(patLength-i-1));

}

}

}

private void suffix(String pattern,int patLength,int [] suffix)

{

suffix[patLength-1]=patLength;

int q=0;

for(int i=patLength-2;i>=0;i--)

{

q=i;

while(q>=0&&pattern.charAt(q)==pattern.charAt(patLength-1-i+q))

{

q--;

}

suffix[i]=i-q;

}

}

private void preBmGs(String pattern,int patLength,int []bmGs)

{

int i,j;

int []suffix=new int[patLength];

suffix(pattern,patLength,suffix);

//模式串中没有子串匹配上好后缀,也找不到一个最大前缀

for(i=0;i

{

bmGs[i]=patLength;

}

//模式串中没有子串匹配上好后缀,但找到一个最大前缀

j=0;

for(i=patLength-1;i>=0;i--)

{

if(suffix[i]==i+1)

{

for(;j

{

if(bmGs[j]==patLength)

{

bmGs[j]=patLength-1-i;

}

}

}

}

//模式串中有子串匹配上好后缀

for(i=0;i

{

bmGs[patLength-1-suffix[i]]=patLength-1-i;

}

System.out.print("bmGs:");

for(i=0;i

{

System.out.print(bmGs[i]+",");

}

System.out.println();

}

private int getBmBc(String c,Map bmBc,int m)

{

//如果在规则中则返回相应的值,否则返回pattern的长度

if(bmBc.containsKey(c))

{

return bmBc.get(c);

}else

{

return m;

}

}

public void boyerMoore(String pattern,String text )

{

int m=pattern.length();

int n=text.length();

Map bmBc=new HashMap();

int[] bmGs=new int[m];

//proprocessing

preBmBc(pattern,m,bmBc);

preBmGs(pattern,m,bmGs);

//searching

int j=0;

int i=0;

int count=0;

while(j<=n-m)

{

for(i=m-1;i>=0&&pattern.charAt(i)==text.charAt(i+j);i--)

{ //用于计数

count++;

}

if(i<0){

System.out.println("one position is:"+j);

j+=bmGs[0];

}else{

j+=Math.max(bmGs[i],getBmBc(String.valueOf(text.charAt(i+j)),bmBc,m)-m+1+i);

}

}

System.out.println("count:"+count);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值