Ich bin nur ein CS-Student des zweiten Semesters und kann keine der bekannten effizienten Teilstringsuchalgorithmen verwenden. Ich muss die Methode indexOf mit der folgenden Methodensignatur implementieren:Java's indexOf-Methode implementieren (Substring-Suche)
int indexOf(String str, String pattern)
, die den Index der ersten Stelle, an der Muster als Teilzeichenfolge von str erscheint.
Dies ist, was ich versucht:
Zuerst habe ich erstellt indexOf(String str, char ch, int startIndex)
eine überladene Methode Index mit der Signatur, die den Index der ersten Stelle von char zurück oder -1 sonst.
private int indexOf(String str, char ch, int startIndex) {
for(int i = startIndex; i < str.length(); i++)
if(str.charAt(i) == ch) return i;
return -1;
}
Jetzt schreibe ich die Methode, die nach einer Teilsucht (pattern
).
private int indexOf(String str, String pattern) {
int headIndex = indexOf(str, pattern.charAt(0), 0);
int tailIndex = indexOf(str, pattern.charAt(pattern.length() - 1), 0);
if(headIndex == -1 || tailIndex == -1) return -1; // no substring match
while(true) {
int j = 0;
for(int i = headIndex; i <= tailIndex; i++)
if(str.charAt(headIndex) != pattern.charAt(j++)) { //if substring does not match then compute a new head and tail Index
headIndex = indexOf(str, pattern.charAt(0), headIndex);
tailIndex = indexOf(str, pattern.charAt(pattern.length() - 1), tailIndex);
j = 0;
i = headIndex + 1;
if(headIndex == -1 || tailIndex == -1) return -1;
break;
}
if(headIndex >= 0) return headIndex;
}
}
Ich glaube, ich bin in der Nähe aber ruft wie indexOf("Hellolo", "lo")
kehrt 2 statt 3. Ich versuche, herauszufinden, wo ich mit meiner Logik falsch gelaufen ist und Hilfe brauchen, so zu tun.
Ich darf keine speziellen String-Methoden außer Länge verwenden.
Vielleicht, weil Indizes bei 0 und nicht bei 1 beginnen? –
"kann keinen der bekannten effizienten Teilstringsuchalgorithmen verwenden" bedeutet das, dass Sie keine vorhandene Implementierung verwenden können oder dass Sie einen unbekannten und ineffizienten Algorithmus verwenden müssen? –
@AndyTurner Kann keine vorhandene Implementierung wie Boyer-Moore verwenden –