Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java搜索字符串(kmp)_Java_String_Search_Knuth Morris Pratt - Fatal编程技术网

Java搜索字符串(kmp)

Java搜索字符串(kmp),java,string,search,knuth-morris-pratt,Java,String,Search,Knuth Morris Pratt,我想搜索字符串b中出现了多少个字符串(比如a)。 我曾想过实现Knuth-Morris-Pratt算法,但我更喜欢内置java函数。有这样的功能吗?我希望函数的复杂度尽可能低,因为我多次使用它。KMP算法不是标准Java库的一部分,但很容易在网上找到实现,就像。这是我做的一个非常老的项目的一部分。可能有助于激发灵感,但不确定这是否是最快的方式 基本上,您可以使用自动机函数来创建状态机表。然后,使用数学函数检查发生的情况 自动机参数:pattern是您正在寻找的模式,alpha是该模式中的所有字符

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

KMP算法不是标准Java库的一部分,但很容易在网上找到实现,就像。

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

基本上,您可以使用自动机函数来创建状态机表。然后,使用数学函数检查发生的情况

自动机参数:pattern是您正在寻找的模式,alpha是该模式中的所有字符(例如:pattern-aabba,alpha-ab)

我对法国人的评论表示敬意

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;
}
公共自动机(字符串模式,char[]alpha){
//声明和初始化
_α=α;
_模式=模式;
int m=pattern.length();
字符串Pqa=“”;
字符串Pk=“”;
//地图初始化
对于(int map=0;map
希望有帮助

问候,,
Erwald

在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);
int n=0,i=0;
而(i

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

您能更具体一点吗?是否在较大的文本中搜索小查询?