Строка поиска Java (км)
Я хочу найти, сколько вхождений строки (скажем, a) в строке b. Я думал о реализации алгоритма Кнута-Морриса-Пратта, но я предпочитаю встроенную функцию Java. Есть ли такая функция? Я хочу, чтобы функция была как можно более низкой, насколько это возможно, поскольку я использую ее много раз.
3 ответа
Алгоритм KMP не является частью стандартной библиотеки Java, но его достаточно легко найти в сети, например, такую.
В 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);
он считает все вхождения подстроки.
Это часть очень старого проекта, который я сделал. Может быть хорошо для вдохновения, но не уверен, что это самый быстрый способ.
В основном вы используете функцию Automaton для создания таблицы конечного автомата. Затем вы используете математическую функцию, чтобы проверить вхождения!
Параметр автомата: шаблон - это шаблон, который вы ищете, а альфа - все символы в этом шаблоне (например: шаблон - aabba, альфа - 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;
}
Надеюсь, поможет!
С уважением, Эрвальд