Проверка, содержат ли 2 строки одинаковые символы? - PullRequest
8 голосов
/ 21 октября 2010

Есть ли способ проверить, содержат ли две строки одинаковые символы.Например,

abc, bca -> true
aaa, aaa -> true
aab, bba -> false
abc, def -> false

Ответы [ 8 ]

22 голосов
/ 21 октября 2010

Превратите каждую строку в символ [], отсортируйте этот массив, затем сравните их. Простой.

private boolean sameChars(String firstStr, String secondStr) {
  char[] first = firstStr.toCharArray();
  char[] second = secondStr.toCharArray();
  Arrays.sort(first);
  Arrays.sort(second);
  return Arrays.equals(first, second);
}
6 голосов
/ 21 октября 2010

Очень простой, но не очень эффективный способ сделать это, конвертировать ваши String s в массивы char и использовать для них java.util.Arrays.sort, получить обратно String s и сравнить на равенство.Если ваши строки меньше нескольких тысяч символов, это будет очень хорошо.

Если у вас несколько строк в мегабайтах, вы можете создать массив с количеством для каждого символа (используя его код в качестве индекса), имейте один проход на одну строку, добавляя один на счетчик каждого символа, и один проход на вторую строку, удаляя один.Если вы упадете ниже 0 в любой момент во время второго прохода, они не будут иметь одинаковых символов.Когда вы закончите со второй строкой без ошибок, вы уверены, что они имеют одинаковые символы, если они имеют одинаковую длину (которую вы должны были сначала проверить в любом случае).
Этот второй метод намного сложнее, чем сортировка строк, и он требует большого массива, если вы хотите работать со строками Unicode, но очень хорошо, если у вас все в порядке только с 128 символами набора ascii, и намного быстрее.
НЕ беспокойтесь, если вы не используетев ваших строках не должно быть нескольких миллионов символов.Сортировка строк намного проще и не намного медленнее для строк с парой дюжин символов.

3 голосов
/ 21 октября 2010

Возможно, это не самый быстрый ответ, но это должен быть самый короткий ответ.

boolean hasSameChar(String str1, String str2){
  for(char c : str1.toCharArray()){
    if(str2.indexOf(c) < 0 ) return false;
  }
  for(char c : str2.toCharArray()){
    if(str1.indexOf(c) < 0 ) return false;
  }
  return true;
}
3 голосов
/ 21 октября 2010

Как примечание (придирчивость ;-)):

Помните, что предлагаемые здесь решения работают только для строк, состоящих из символов из Базовой многоязычной плоскости (BMP) Unicode.

Символы за пределами BMP представлены в виде пары из char в String, поэтому вам нужно уделять дополнительное внимание, чтобы вы держали пары вместе.Смотрите подробности в Javadocs java.lang.Character.

К счастью, большинство персонажей за пределами BMP довольно экзотичны.Даже большая часть японцев и китайцев находится в БМП ...

1 голос
/ 21 октября 2010

Рассмотрите возможность создания подписи для данной строки.Используя количество и символ.

a-count:b-count:c-count:.....:z-count: (если хотите, используйте заглавные буквы).

Затем сравните подпись.Это должно лучше масштабироваться для очень больших строк.

В качестве ярлыка проверьте длину.Если они не совпадают, верните false в любом случае.

1 голос
/ 21 октября 2010

Вы можете преобразовать строку в массив char, отсортировать массивы и сравнить их:

String str1 = "abc";                 
String str2 = "acb";
char[] chars1 = str1.toCharArray();
char[] chars2 = str2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);

if(Arrays.equals(chars1,chars2)) {
        System.out.println(str1 + " and " + str2 + " are anagrams");
} else {
        System.out.println(str1 + " and " + str2 + " are not anagrams");
}
0 голосов
/ 14 августа 2013

Здесь:

import java.util.Arrays;

открытый класс CompareString {

String str = "Result";
String str1 = "Struel";

public void compare() {
    char[] firstString = str.toLowerCase().toCharArray();
    char[] secondString = str1.toLowerCase().toCharArray();

    Arrays.sort(firstString);
    Arrays.sort(secondString);

    if (Arrays.equals(firstString, secondString) == true) {
        System.out.println("Both the string contain same charecter");
    } else {
        System.out.println("Both the string contains different charecter");
    }
}

public static void main(String[] args) {
    CompareString compareString = new CompareString();
    compareString.compare();
}

}

0 голосов
/ 21 октября 2010

здесь:

    String str1 = "abc";
    String str2 = "cba";
    /* create sorted strings */

/*  old buggy code
    String sorted_str1 = new String( java.utils.Arrays.sort(str1.toCharArray()) );
    String sorted_str2 = new String( java.utils.Arrays.sort(str2.toCharArray()) );
*/    
/* the new one */
char [] arr1 = str1.toCharArray();
char [] arr2 = str2.toCharArray();
java.utils.Arrays.sort(arr1);
java.utils.Arrays.sort(arr2);
String sorted_str1 = new String(arr1);
String sorted_str2 = new String(arr2);

if (sorted_str1.equals( sorted_str2 ) ) {
        /* true */
    } else {
        /* false */
    }
...