加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Boyer-Moore算法java实现

发布时间:2020-12-15 00:17:53 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.util.*; public class BoyerMoore { public static void main(String[] args) { String text="中国是一个伟大的国度;伟大的祖国啊"; Str

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    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<String,Integer> 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 [] 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 []bmGs)  
        {  
            int i,j;  
            int []suffix=new int[patLength];  
            suffix(pattern,patLength,suffix);  
            //模式串中没有子串匹配上好后缀,也找不到一个最大前缀  
            for(i=0;i<patLength;i++)  
            {  
                bmGs[i]=patLength;  
            }  
            //模式串中没有子串匹配上好后缀,但找到一个最大前缀  
            j=0;  
            for(i=patLength-1;i>=0;i--)  
            {  
                if(suffix[i]==i+1)  
                {  
                    for(;j<patLength-1-i;j++)  
                    {  
                        if(bmGs[j]==patLength)  
                        {  
                            bmGs[j]=patLength-1-i;  
                        }  
                    }             
                }  
            }  
            //模式串中有子串匹配上好后缀  
            for(i=0;i<patLength-1;i++)  
            {  
                bmGs[patLength-1-suffix[i]]=patLength-1-i;  
            }  
            System.out.print("bmGs:");  
            for(i=0;i<patLength;i++)  
            {  
                System.out.print(bmGs[i]+",");  
            }  
            System.out.println();  
        }  
        private int getBmBc(String c,Integer> 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<String,Integer> bmBc=new HashMap<String,Integer>();  
            int[] bmGs=new int[m];  
            //proprocessing  
            preBmBc(pattern,m,bmBc);  
            preBmGs(pattern,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);  
        }  
      
    }  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读