【问题标题】:Java search String(kmp)Java 搜索字符串(kmp)
【发布时间】:2012-04-14 18:06:47
【问题描述】:

我想搜索一个字符串(比如说a)在字符串b中出现了多少次。 我想过实现 Knuth-Morris-Pratt 算法,但我更喜欢内置的 java 函数。有没有这样的功能?由于我多次使用该函数,因此我希望该函数的复杂度尽可能低。

【问题讨论】:

  • 你能说得更具体些吗?您是在大文本中搜索小查询吗?

标签: java string search knuth-morris-pratt


【解决方案1】:

KMP 算法不是标准 Java 库的一部分,但很容易在网上找到实现,例如 this one

【讨论】:

    【解决方案2】:

    这是我做过的一个非常古老的项目的一部分。可能有助于激发灵感,但不确定这是否是最快的方式。

    基本上,您使用 Automaton 函数来创建状态机表。然后,您使用数学函数来检查出现次数!

    Automaton 参数:pattern 是您要查找的模式,alpha 是该模式中的所有字符(例如:pattern - aabba,alpha - ab)

    我向法国 cmets 致歉!

    public Automaton(String pattern, char[] alpha){
    
        //declaration et initialisation
        _alpha = alpha;
        _pattern = pattern;
        int m = pattern.length();
        String Pqa = "";
        String Pk = "";
    
        //Initialisation du Map
        for(int map = 0; map < alpha.length ; map++){
            alphaMapc.put(alpha[map],alpha[map]);
            alphaMapNum.put(alpha[map],map);
        }
    
        tableau = new int[pattern.length()+1][alpha.length];
    
        // Algo d'apres le pseduo code et les notes
        for(int q=0 ; q <= m ; q++){            
            for( int j =0 ; j <  alpha.length ;  j++  ){
                Pqa = pattern.substring(0,q );
                Pqa += alpha[j];
                int k = Math.min(m+1, q+2);
    
                //Do while qui test Pq avec toutes le fins possibles
                do{
                    k = k-1;
                    Pk = pattern.substring(0, k);
    
                }while( k >0 && !(Pqa.endsWith(Pk)) );
    
                tableau[q][j] = k;
                System.out.print(k + " "); // TEST OUTPUT
            }
            System.out.println(); // TEST OUTPUT
        }
    
    
    
    }
    
    public int match(String string) {
    
        //Initialisation de letat et du compte
        int etat = 0;
        int compte = 0;
    
        for(int s = 0; s < string.length() ; s++){          
            char t = string.charAt(s);      
    
            //Acces en O(1)
            if(t == alphaMapc.get(t)) etat = tableau[etat][alphaMapNum.get(t)];
    
            //Si on atteint un etat final, on recommence a l'entree de la machine et on increment le compteur
            if(etat == 15){
                etat = 0;
                compte++;
            }
        }
    
        //Test
        System.out.println("Compte: " + compte);
        return compte;
    }
    

    希望对你有帮助!

    问候, 厄瓦尔德

    【讨论】:

      【解决方案3】:

      在 Java 中,您可以简单地使用 String.indexOf() 方法。

      它不使用 KMP 算法。对于短字符串来说已经足够了,但是如果你需要性能并且你打算使用大字符串,那就不是一个好的选择。

      但是,如果您想要一个简单的解决方案,这里是:

      int n = 0, i = 0;
      while (i < str.length() 
             && (i = str.indexOf("al", i)) != -1) {
        ++n;
        ++i;
      }
      System.out.println("n: " + n);
      

      它计算子字符串的所有出现次数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2016-11-15
        • 2018-05-22
        • 2011-03-17
        相关资源
        最近更新 更多