Unten ist meine Lösung. Die Raumkomplexität ist nur O(a + b)
, und die Laufzeit (wenn ich kann richtig berechnen ..) ist O(b*a)
, wie für jedes Zeichen in b
, können wir eine Rekursion a
Ebenen tief.
md5's Antwort ist eine gute und wird schneller sein !!
public class FindPermutations {
public static void main(String[] args) {
System.out.println(numPerms(new String("xacxzaa"),
new String("fxaazxacaaxzoecazxaxaz")));
System.out.println(numPerms(new String("ABCD"),
new String("BACDGABCDA")));
System.out.println(numPerms(new String("AABA"),
new String("AAABABAA")));
// prints 4, then 3, then 3
}
public static int numPerms(final String a, final String b) {
int sum = 0;
for (int i = 0; i < b.length(); i++) {
if (permPresent(a, b.substring(i))) {
sum++;
}
}
return sum;
}
// is a permutation of a present at the start of b?
public static boolean permPresent(final String a, final String b) {
if (a.isEmpty()) {
return true;
}
if (b.isEmpty()) {
return false;
}
final char first = b.charAt(0);
if (a.contains(b.substring(0, 1))) {
// super ugly, but removes first from a
return permPresent(a.substring(0, a.indexOf(first)) + a.substring(a.indexOf(first)+1, a.length()),
b.substring(1));
}
return false;
}
}
Aus Gründen der Auffindbarkeit, komme ich auf dieser Seite afer nach anderen Lösungen suchen Mine, mit dem Problem aus der Beobachtung dieser Clip Ursprung zu vergleichen: https://www.hackerrank.com/domains/tutorials/cracking-the-coding-interview. Die ursprüngliche Problembeschreibung war etwas wie "finde alle Permutationen von s in b".
seit wann wird O (n) sortiert? – Leeor
Ich entschuldige mich, ich habe es korrigiert. Ich denke. Ich bin nicht gut bei großen O-Notationen. @Leeor –
@Leeor: Eine Zeichenkette gehört normalerweise zu einem kleinen Alphabet, also sortiere sie mit dem Zählensortieren ist 'O (n + s)' ... – md5