Hallo zusammen,
Ich habe 1 Klasse in der ich den KMP-Search Algorithmus implementiert habe. Dieser liefert die erste Fundstelle für ein Pattern als int zurück. Funktioniert auch soweit. Nun hätte ich allerdings gerne ALLE Fundstellen des Patterns zurückgegeben. Wollte hierfür die ArrayList benutzen. Nun funktioniert es manchmal. Wenn das Pattern allerdings vor der Stelle 3 gefunden wird, oder mehrmals vorkommt, funktioniert es nicht.
Ich verstehe nicht warum der Index mal passt und mal nicht. Kann mir jemand auf die Sprünge helfen? Vielen Dank!
Implementierung mit ArrayList
Ich habe 1 Klasse in der ich den KMP-Search Algorithmus implementiert habe. Dieser liefert die erste Fundstelle für ein Pattern als int zurück. Funktioniert auch soweit. Nun hätte ich allerdings gerne ALLE Fundstellen des Patterns zurückgegeben. Wollte hierfür die ArrayList benutzen. Nun funktioniert es manchmal. Wenn das Pattern allerdings vor der Stelle 3 gefunden wird, oder mehrmals vorkommt, funktioniert es nicht.
Code:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 1
at java.lang.String.charAt(String.java:694)
at Suchalgorithmen.kmpSearch(Suchalgorithmen.java:25)
at Testprogramm.main(Testprogramm.java:33)
Ich verstehe nicht warum der Index mal passt und mal nicht. Kann mir jemand auf die Sprünge helfen? Vielen Dank!
Java:
public class Testprogramm{
public static void main(String[] args) {
System.out.print(Suchalgorithmen.kmpSearch("baaab", "b"));
}
}
public class Suchalgorithmen {
public static int kmpSearch (String text, String pat) {
int[] next = initNext (pat);
int i = 0, j = 0;
while (i < text.length()) {
while (j >= 0 && pat.charAt(j) != text.charAt(i))
j = next[j];
i++; j++;
if (j == pat.length()) return i - pat.length(); //gefunden
}
return -1;//-1; // nicht gefunden
}
private static int[] initNext (String pattern) {
int[] next = new int [pattern.length ()];
int i = 0, j = -1;
next[0] = -1;
while (i < pattern.length() - 1) {
while (j >= 0 && pattern.charAt(i) !=
pattern.charAt(j))
j = next[j];
i++; j++;
next[i] = j;
}
return next;
}
}
Implementierung mit ArrayList
Java:
public static ArrayList<Integer >kmpSearch (String text, String pat) {
ArrayList<Integer> gefundene_positionen_kmp = new ArrayList<Integer>();
int[] next = initNext (pat);
int i = 0, j = 0;
while (i < text.length()) {
while (j >= 0 && pat.charAt(j) != text.charAt(i))
j = next[j];
i++; j++;
if (j == pat.length()) gefundene_positionen_kmp.add(i - pat.length());
}
if (gefundene_positionen_kmp.isEmpty()) return null;
else return gefundene_positionen_kmp;
}