Как сравнить две строки, если они переставлены - PullRequest
4 голосов
/ 28 сентября 2011

Я хотел знать, как я могу сравнить две переставленные строки Например, если String a = "string", String b = "tsrngi" ... Если я сравниваю a.equals (b), он вернет false из-за порядкасимволы ... Я хочу, чтобы он возвращал истину, потому что символы одинаковы, но отличается только порядок .. Спасибо

Ответы [ 2 ]

8 голосов
/ 28 сентября 2011

Сортируйте их, затем сравните. Для сортировки используйте что-то вроде:

char[] content = unsorted.toCharArray();
java.util.Arrays.sort(content);
String sorted = new String(content);
6 голосов
/ 28 сентября 2011

Мне очень нравится решение JRL, поскольку оно довольно элегантное.В то же время я чувствую, что, поскольку есть решение, которое на порядок лучше, я должен поделиться им.Это менее элегантно, но это O(n) вместо O(n lg n).

if(str1.length() != str2.length()) return false; 
Map<Character, Integer> counts = new HashMap<Character, Integer>();

for(int i = 0; i < str1.length(); i++) {
    // add 1 for count for str1
    if(counts.contains(str1.charAt(i)) {
        counts.put(str1.charAt(i),counts.get(star1.charAt(i)) + 1);
    } else {
        counts.put(str1.charAt(i),1);
    }
    // sub 1 for count for str2
    if(counts.contains(str1.charAt(i)) {
        counts.put(str1.charAt(i),counts.get(star1.charAt(i)) - 1);
    } else {
        counts.put(str1.charAt(i),-1);
    }
}
// when you're done, all values in the map should be 0. If they
// aren't all 0, you don't have equal-arranged strings.
for(Integer i : counts.values()) {
    if(i.intValue() != 0) return false;
}
// we made it this far, we know it's true
return true;
...