Проверьте, являются ли две строки анаграммой

Я написал метод для проверки того, являются ли две строки анаграммой или нет. Метод возвращает true, даже если слова не являются анаграммами. Я не вижу никаких ошибок в коде, есть идеи, как я могу улучшить? Метод следующий,

public static boolean checkAnagram( String one, String two){

    if ( one.length() != two.length() ) 
        return false;

    char[] letters  = new char[128];

    for ( char c: one.toCharArray()){

        letters[c]++;
    } 


    for( int j =0; j < two.length(); j++){

        int c = (int) two.charAt(j);

        if( --letters[c] < 0) return false;

    }

    return true;
}

person Arefe    schedule 03.01.2016    source источник
comment
Я не уверен, как именно работает этот алгоритм, но просто мое личное мнение: используйте toCharArray(), отсортируйте по алфавиту, затем сравните массивы.   -  person Arc676    schedule 03.01.2016
comment
Я знаю несколько других способов сделать это, я просто хочу знать, почему этот маленький код не работает. Этот алгоритм отслеживает символы, используя их значения ASCII.   -  person Arefe    schedule 03.01.2016
comment
Связано: stackoverflow.com/q/15045640/1079354   -  person Makoto    schedule 03.01.2016


Ответы (2)


letters — это массив char, поэтому letters[i] никогда не может быть отрицательным (диапазон char — от 0 до 2^16-1). Если вы попытаетесь уменьшить его значение ниже 0, оно уменьшится до Character.MAX_VALUE. Измените его на int[].

person Eran    schedule 03.01.2016
comment
Спасибо, я также обнаружил это при более внимательном рассмотрении. - person Arefe; 03.01.2016

В первом цикле for вы используете:

letters[c]++;

когда c является char.
В другом цикле for вы выполняете cast c в int, выполняя (int)two.charAt(j) перед тем, как назначить его c.

Кроме того, вы получаете true каждый раз, потому что у вас не может быть отрицательного значения в массиве char, поэтому в каждом индексе существует это letters[index] >= 0. Вам нужно изменить массив на int[128].

person Idos    schedule 03.01.2016