È possibile utilizzare String.equals
, anche se indirettamente. In primo luogo è necessario un metodo di supporto:
// given a String, sorts its chars and return it as another String
public static String sorted(String s) {
char[] arr = s.toCharArray();
Arrays.sort(arr);
return new String(arr);
}
allora si può avere:
String s1 = "qwerty";
String s2 = "qywter";
System.out.println(sorted(s1)); // eqrtwy
System.out.println(sorted(s1).equals(sorted(s2))); // true
Nota che questo non è l'algoritmo più efficiente - è O(N log N)
tempo, e utilizza lo spazio estraneo - ma dovrebbe funzionare bene per le corde corte. Per le stringhe lunghe, dovresti passare attraverso ogni char
(o punti di codice Unicode) manualmente (invece di toCharArray()
), e forse usare il tempo lineare counting sort.
Se non si cura di carattere specifico che conta corrispondenza (ad esempio "xxxyyy"
e "xy"
ha gli stessi caratteri, anche se in numeri diversi), quindi è possibile utilizzare una rappresentazione set-simile (java.util.BitSet
).
// given a string, returns its used char set as a java.util.BitSet
public static BitSet usedChar(String s) {
BitSet bs = new BitSet();
for (int i = 0; i < s.length(); i++) {
bs.set(s.charAt(i));
}
return bs;
}
allora si può avere:
System.out.println(
usedChar("xxxyyy").equals(usedChar("xy"))
); // true
System.out.println(
usedChar("xyz").equals(usedChar("abc"))
); // false
Che dovrebbe essere il risultato nel caso in cui essi hanno gli stessi personaggi, ma non lo stesso numero di caratteri? (Come "qwerty" e "qywtery"?) Contengono gli stessi caratteri, ma non lo stesso numero di caratteri. – MikeTheReader