Ошибка алгоритма анаграммы
Возможный дубликат:
Алгоритм анаграммы в Java
public static boolean test(String a, String b) {
a=a.toLowerCase();
b=b.toLowerCase();
boolean result = true ;
boolean tmp1=false;
if(a.length()==b.length()){
for(int i=0;i<a.length();i++){
tmp1=false;
for(int k=0;k<b.length();k++){
if(a.charAt(i)==b.charAt(k)){
return true;
}
}
if(tmp1==false){
result=false;
break;
}
if(i==a.length()-1)
result=true;
}
}
else {
result=false;
}
return result;
}
Я хочу сделать программу для поиска слов анаграммы.
Код работает правильно, когда ввод
- слово одно дса
- второе слово asd
- Вывод анаграммы (правильный результат)
Код не для ввода
- первое слово асса
- второе слово асаа
- результат - анаграмма (НЕПРАВИЛЬНЫЙ результат)
В чем я виновата?
3 ответа
Ваш алгоритм решает, что слово является анаграммой слишком рано - фактически, как только оно может сопоставить первую букву первого слова с любой буквой второго слова:
if(a.charAt(i)==b.charAt(k)){
return true;
}
Самый простой алгоритм обнаружения анаграммы в Java выглядит следующим образом:
- Перерабатывать
a
а такжеb
к массивам символовcharArrayA
а такжеcharArrayB
- Сортировать
charArrayA
а такжеcharArrayB
- Создать строки
sortedA
а такжеsortedB
из отсортированных массивов - Вернуть
sortedA.equals(sortedB)
,
Вы позволяете i
беги от 0 до a.length()
а также k
от 0 до b.length()
, Таким образом, обе переменные цикла начинаются с начала соответствующей строки.
Кроме того, во внутреннем цикле вы сразу же возвращаетесь true
для всей функции, если в любой момент любой символ в b
соответствует персонажу в a
,
Прежде всего, если вы собираетесь использовать такие заявления, как return true
или же return false
, используйте их последовательно (избавиться от boolean result
).
Проблема этого алгоритма в том, что как только он обнаружит пару идентичных символов, он вернет true. Чтобы это исправить, рассмотрите возможность сортировки двух строк и проверки равенства всех символов (подсказка: Arrays.sort
а также String.toCharArray
).