CTCI Создание анаграмм - получение неверного вывода - PullRequest
0 голосов
/ 17 октября 2018

Я пишу функцию, которая принимает две строки и должна удалять символы из одной или обеих строк, пока обе строки не будут иметь одинаковые символы.Затем я должен вернуть количество символов, которое необходимо было удалить, чтобы получить статус анаграммы для обоих.Я получаю странный вывод (и прохожу один тестовый пример).Может кто-нибудь сказать мне, где моя функция не работает?

public class Solution {
static int makeAnagram(String a, String b, int aLeng, int bLeng) {
    StringBuilder stringA = new StringBuilder(a);
    StringBuilder stringB = new StringBuilder(b);    

    int result=0;
    for (int i=0; i<stringB.length();i++)
    {
        if (a.contains(b.substring(i)))
            continue;
        else
            stringB.deleteCharAt(i);
    }
    for (int i=0; i<stringA.length();i++)
    {  
        //if(stringB.toString().contains(stringA.toString().substring(i)))
        if (b.contains(a.substring(i)))
             continue;
        else
            stringA.deleteCharAt(i);
    }
    if (stringA.length()==stringB.length())
         result = (aLeng-stringA.length()) + (bLeng-stringB.length());
    else
         result = -1;
    return result;
}

private static final Scanner scanner = new Scanner(System.in);

public static void main(String[] args) throws IOException {
    BufferedWriter bufferedWriter = new BufferedWriter(new                                             FileWriter(System.getenv("OUTPUT_PATH")));

    String a = scanner.nextLine();

    String b = scanner.nextLine();

    int aLeng = a.length();
    int bLeng = b.length();

    int res = makeAnagram(a, b, aLeng, bLeng);

    bufferedWriter.write(String.valueOf(res));
    bufferedWriter.newLine();

    bufferedWriter.close();

    scanner.close();
}
}

Контрольный пример 1

Input (stdin)
cde
abc
Your Output (stdout)
4
Expected Output
4

Контрольный пример 2

Input (stdin)
fcrxzwscanmligyxyvym
jxwtrhvujlmrpdoqbisbwhmgpmeoke
Your Output (stdout)
-1
Expected Output
30
Compiler Message
Wrong Answer

Контрольный пример3

Input (stdin)
showman
woman
Your Output (stdout)
6
Expected Output
2
Compiler Message
Wrong Answer

1 Ответ

0 голосов
/ 18 октября 2018

Вам не нужно использовать подстроку, которая дороже в случае большей строки.Вы можете использовать приведенный ниже алгоритм.Я рекомендую указывать имя как checkAnagram вместо makeAnagram

string_counter_map = {}
for char in string1:
    if char in string_counter_map:
        string_counter_map[char] += 1
 for char in string2:
    if char in string_counter_map:
        string_counter_map[char] -= 1
    else:
        string_counter_map[char] = 1

Предполагая, что если все символы string_counter_map содержат ноль, это анаграмма, иначе это не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...