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

Java实现字符串匹配算法KMP

发布时间:2020-05-25 14:03:36 所属栏目:Java 来源:互联网
导读:Java实现字符串匹配算法KMP

下面是脚本之家 jb51.cc 通过网络收集整理的代码片段。

脚本之家小编现在分享给大家,也给大家做个参考。

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

以上是脚本之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

(编辑:安卓应用网)

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

    推荐文章
      热点阅读