2010-08-23 4 views
5

Мой вопрос в том, что у меня есть 2 строки, например String1 & String2. Теперь я хочу проверить, содержат ли эти две строки одинаковые символы или нет, независимо от их последовательности.Как сравнить 2 строки, содержащие одинаковые символы

Предположим, String1= "qwerty", String2= "qywter". Теперь эти строки содержат одинаковые символы, но находятся в другой последовательности. Итак, есть ли какая-либо функция, которая может использоваться, чтобы показать, что эти строки содержат одинаковые символы? Может ли метод equals() делать это ???

Вся помощь приветствуется.

+6

Что должно быть результатом в случае, когда они имеют одни и те же символы, но не такое же количество символов? (Например, «qwerty» и «qywtery»?) Они содержат одни и те же символы, но не одинаковое количество символов. – MikeTheReader

ответ

17
char[] chars1 = string1.toCharArray(); 
char[] chars2 = string2.toCharArray(); 
Arrays.sort(chars1); 
Arrays.sort(chars2); 

return Arrays.equals(chars1, chars2); 
+1

но что они возвращают ??? – prasad

+0

@prasad - я не понял ваш комментарий – Bozho

+0

Я имею в виду, do "return Arrays.equals (chars1, chars2);" оператор возвращает логическое значение или int? – prasad

2

Вы можете использовать String.equals, хотя и косвенно. Прежде всего, необходимо вспомогательный метод:

// 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); 
} 

Тогда вы можете иметь:

String s1 = "qwerty"; 
    String s2 = "qywter"; 

    System.out.println(sorted(s1)); // eqrtwy 

    System.out.println(sorted(s1).equals(sorted(s2))); // true 

Обратите внимание, что это не самый эффективный алгоритм - это O(N log N) время, и использует постороннее пространство - но должно работать отлично подходит для коротких строк. Для длинных строк вы хотите пройти через каждый char (или кодовые точки Юникода) вручную (вместо toCharArray()) и, возможно, использовать линейное время counting sort.

Если вы не заботитесь о специфике отсчитывает сопоставления (например, "xxxyyy""xy" и имеют те же символы, хотя и в разных числах), то вы можете использовать подобный набор представления (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; 
} 

Тогда вы можете иметь:

System.out.println(
     usedChar("xxxyyy").equals(usedChar("xy")) 
    ); // true 

    System.out.println(
     usedChar("xyz").equals(usedChar("abc")) 
    ); // false 
2

Это зависит от того, действительно ли вы хотите символы или вы действительно хотите точки коды, а затем это важно, хотите ли вы сосчитать дубликаты или нет. Вот одно решение:

public class a { 
    public static void main(String[] args) { 
    String s1 = "qwerty"; 
    String s2= "qywter"; 
    System.out.println(codePointSet(s1).equals(codePointSet(s2))); 
    } 
    public static Set<Integer> codePointSet(String s) { 
    Set<Integer> set = new TreeSet<Integer>(); 
    for (int i = 0, cp; i < s.length(); i += Character.charCount(i)) { 
     cp = s.codePointAt(i); 
     set.add(cp); 
    } 
    return set; 
    } 
} 
0

String.equals() не будет работать для вашего конкретного случая. Вероятно, вам нужно будет написать свой собственный метод, чтобы приравнять строки таким образом.

1
int[] f = new int[(int)char.MaxValue]; 
foreach (var c in string1) f[(int)c]++; 
foreach (var c in string2) f[(int)c]--; 
return f.Max() == 0 && f.Min() == 0; 

Это является предпочтительным решением, когда string1.length() >> char.MaxValue и она имеет более низкую большую сложность O обозначение.

EDIT это на самом деле код C#, но вы можете легко достичь аналогичного результата в Java.

+0

Интересный подход, хотя, конечно, не Java. –

0

Если у вас есть длинная строка, что вам нужно сравнить, и вам не нужны гарантии успеха, вы можете сделать что-то вроде этого:

  1. убедитесь, что строки имеют одинаковую длину
  2. для каждого изображения
  3. сложить все символы (литое, как Интс)
  4. сложить квадраты символов (опять же, как отливает Интс)
  5. сравнить суммы квадратов и суммы
  6. Если они одинаковые, то строки содержат одни и те же символы.

Фактически я потратил некоторое время, пытаясь выяснить, где это не сработает, но я не могу думать об одном. Моя кишка говорит мне, что мне что-то не хватает, или это хороший компаратор для этого случая.

0

два шага требуют

  1. ли XOR обеих строк, и если исключающее является 0, то вы частично уверены.

  2. Если xor равно 0, то найдите сумму значения ascii обеих строк, и если сумма ascii равна таковой, то обе строки одинаковы.

Надеется, что это помогает

Смежные вопросы