我想搜索字符串 b 中有多少次出现的字符串(比如说 a)。我想过实现 Knuth-Morris-Pratt 算法,但我更喜欢内置的 java 函数。有没有这样的功能?我希望该函数尽可能地具有最低的复杂性,因为我多次使用它。
问问题
5104 次
3 回答
2
KMP 算法不是标准 Java 库的一部分,但很容易在网上找到实现,比如这个。
于 2012-04-14T18:11:58.983 回答
0
这是我做的一个非常古老的项目的一部分。可能有助于激发灵感,但不确定这是否是最快的方式。
基本上,您使用 Automaton 函数来创建状态机表。然后,您使用数学函数来检查出现的情况!
Automaton Param :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;
}
希望能帮助到你!
问候, 厄瓦尔德
于 2012-04-14T18:19:41.450 回答
0
在 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);
它计算子字符串的所有出现次数。
于 2012-04-14T18:21:51.040 回答