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

Java实现字符串匹配算法KMP

发布时间:2020-12-15 00:27:52 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代, 否则

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

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

kmp算法的核心思想:先对搜索字串生成偏移对照表,匹配时从左向右依次比较(bm从右向左,号称比kmp更快),相等则文档和搜索字串的下标+1迭代, 否则查表,定位最优的偏移位置(文档下标不变,搜索字串下标改变)。例外是,字符不匹配时,若搜索字串的下标为0,则文档的下标+1,继续迭代比较。
  1. import?java.util.Arrays;??
  2. ??
  3. public?class?KMPSearch?{??
  4. ????public?static?int[]?table;??
  5. ????public?static?void?generateTab(String?key){//查询字串生成偏移对照表,一次迭代就可以??
  6. ????????int?len=key.length();??
  7. ????????table=new?int[len];??
  8. ????????Arrays.fill(table,?0);??
  9. ??????????
  10. ????????for(int?i=1;i<len;i++){??
  11. ????????????if(key.charAt(i)==key.charAt(table[i-1])){??
  12. ????????????????table[i]=table[i-1]+1;??
  13. ????????????}??
  14. ????????}??
  15. ????????for(int?v?:?table){??
  16. ????????????System.out.print(v);??
  17. ????????}??
  18. ????????System.out.println();??
  19. ????}??
  20. ????public?static?int?KMPSearchs(String?doc,String?key){??
  21. ????????generateTab(key);??
  22. ????????int?result=-1;??
  23. ????????int?doc_size=doc.length(),??
  24. ????????????key_size=key.length(),??
  25. ????????????doc_iter=,??
  26. ????????????key_iter=;??
  27. ????????while(doc_iter<doc_size){//遍历所查询的文档,同样,单层循环就可以实现→_→??
  28. ????????????if(doc.charAt(doc_iter)==key.charAt(key_iter)){??
  29. ????????????????doc_iter++;??
  30. ????????????????key_iter++;??
  31. ????????????}else{??
  32. ????????????????if(key_iter==0){??
  33. ????????????????????doc_iter++;??
  34. ????????????????????continue;??
  35. ????????????????}else{??
  36. ????????????????????key_iter=table[key_iter-1];??
  37. ????????????????????continue;??
  38. ????????????????}??
  39. ????????????}??
  40. ????????????if(key_iter==key_size){??
  41. ????????????????result=doc_iter-key_size;??
  42. ????????????????break;??
  43. ????????????}??
  44. ????????}??
  45. ????????return?result;??
  46. ????}??
  47. ????public?static?void?main(String[]?args){??
  48. ????????int?i=KMPSearchs("bbc?abcdab?abcdabcdabde","abcdabd");??
  49. ????????System.out.println(i);??
  50. ????}??
  51. }?
    import java.util.Arrays;  
      
    public class KMPSearch {  
        public static int[] table;  
        public static void generateTab(String key){//查询字串生成偏移对照表,一次迭代就可以  
            int len=key.length();  
            table=new int[len];  
            Arrays.fill(table,0);  
              
            for(int i=1;i<len;i++){  
                if(key.charAt(i)==key.charAt(table[i-1])){  
                    table[i]=table[i-1]+1;  
                }  
            }  
            for(int v : table){  
                System.out.print(v);  
            }  
            System.out.println();  
        }  
        public static int KMPSearchs(String doc,String key){  
            generateTab(key);  
            int result=-1;  
            int doc_size=doc.length(),key_size=key.length(),doc_iter=0,key_iter=0;  
            while(doc_iter<doc_size){//遍历所查询的文档,同样,单层循环就可以实现→_→  
                if(doc.charAt(doc_iter)==key.charAt(key_iter)){  
                    doc_iter++;  
                    key_iter++;  
                }else{  
                    if(key_iter==0){  
                        doc_iter++;  
                        continue;  
                    }else{  
                        key_iter=table[key_iter-1];  
                        continue;  
                    }  
                }  
                if(key_iter==key_size){  
                    result=doc_iter-key_size;  
                    break;  
                }  
            }  
            return result;  
        }  
        public static void main(String[] args){  
            int i=KMPSearchs("bbc abcdab abcdabcdabde","abcdabd");  
            System.out.println(i);  
        }  
    }  

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

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

(编辑:李大同)

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

    推荐文章
      热点阅读