тестовая задача: Нужно определить, можно ли превратить первую строку во вторую

вот задача: На вход подается 2 строки. Нужно определить, можно ли превратить первую строку во вторую, заменяя одни буквы на другие, с учетом следующих правил:

  • участвуют только буквы русского алфавита а-я;
  • все буквы в нижнем регистре;
  • за один шаг можно преобразовать все вхождения одной буквы в другую.

Входные данные Входная информация поступает из стандартного ввода в виде одной строки. В этой строке содержатся две подстроки, разделенные пробелом. Ваше решение должно учитывать вариант, когда на вход поданы строки разной длины. Некорректные данные на вход не поступают, дополнительные проверки не требуются.

Выходные данные В качестве ответа в стандартный вывод программа должна выводить 1 (если превратить можно) или 0 (если превратить нельзя).

Пример 1 Входные данные: привет прикол Выходные данные: 1 Преобразования (выводить не нужно): в ⇒ к (прикет) е ⇒ о (прикот) т ⇒ л (прикол)

Пример 2 Входные данные: ааббдд ддббаа Выходные данные: 1 Преобразования (выводить не нужно): д ⇒ я (ааббяя) а ⇒ д (ддббяя) я ⇒ а (ддббаа)

Пример 3 Входные данные: абаб ааах Выходные данные: 0 Преобразовать нельзя, так как 'б' не сможет оказаться одновременно 'а' и 'х'.

Несколько дней бьюсь, не могу решить( проверяю свою программу примерами которые смог придумать, все правильно работает, пытаюсь сдать, не принимается, пишет что выдает неправильный ответ... вот мой код:

import java.util.*;
public class Main {
    public static int changeWord(String word1, String word2){

        TreeSet<Character> alphavet = new TreeSet<>(Arrays.asList('а', 'б', 'в', 'г', 'д', 'е',  'ж', 'з',
                'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п','р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш',
                'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'));

        char[] firstWord = word1.toCharArray();
        char[] secondWord = word2.toCharArray();
        int tryCheck = 0;
        char[] wordCheck = new char[firstWord.length];
        char[] wordAlphDel = new char[firstWord.length];

        if (word1.equals(word2)) return 1;
        if (firstWord.length != secondWord.length ) return 0;
        if (secondWord.length != firstWord.length) return 0;

        for (int i = 0; i < firstWord.length; i++) {
            for (int j = i +1; j < firstWord.length; j++) {
                if ((j) < firstWord.length) {
                    if (firstWord[i] == firstWord[j] && secondWord[i] == secondWord[j]) {
                        for (int k = 0; k < firstWord.length; k++) {
                            alphavet.remove(firstWord[k]);
                        }
                        word1 = word1.replace(secondWord[i], alphavet.last());
                        wordCheck[tryCheck] = firstWord[i];
                        wordAlphDel[tryCheck] = alphavet.last();
                        alphavet.remove(alphavet.last());
                        tryCheck++;
                        continue;
                    } else if (firstWord[i] == firstWord[j] && secondWord[i] != secondWord[j]) {
                        return 0;
                    } else if (secondWord[i] == secondWord[j] && firstWord[i] != firstWord[j]) {
                        return 0;
                    } else if (secondWord[i] == secondWord[j] && firstWord[i] == firstWord[j]){
                        return 0;
                    }
                } else break;
            }
        }
        for (int i = 0; i < firstWord.length; i++) {
            word1 = word1.replace(firstWord[i],secondWord[i]);
        }
        if (tryCheck > 0) {
            for (int i = 0; i < tryCheck; i++) {
                word1 = word1.replace(wordAlphDel[i], wordCheck[i]);
            }
        }
        return 1;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String task = in.nextLine();

        String [] word = task.split(" ");

        System.out.println(changeWord(word[0],word[1]));

        in.close();
    }
}

Ответы (1 шт):

Автор решения: wigravy
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        System.out.println(convertWord("ааббдд ббддфф"));
        System.out.println(convertWord("ааббдд ддббаа"));
        System.out.println(convertWord("абаб ааах"));
    }

    public static boolean convertWord(String words) {
        String firstWord = words.split(" " )[0];
        String secondWord = words.split(" " )[1];

        if (firstWord.equals(secondWord)) {
            return true;
        }

        if (firstWord.length() != secondWord.length()) {
            return false;
        }

        Map<Character, Character> map = new HashMap<>();

        for (int i = 0; i < firstWord.length(); i++) {
            Character ch1 = firstWord.charAt(i);
            Character ch2 = secondWord.charAt(i);
            if (map.containsKey(ch1) && !map.get(ch1).equals(ch2)) {
                return false;
            }
            map.put(ch1, ch2);
        }

        return true;
    }
}
// Вывод: 
// true
// true
// false

Начал писать код с if, но посмотрел ссылку с мапой и она мне больше зашла) Это просто адаптация кода с C#. Поставте стрелочку вверх автору оригинального ответа.

→ Ссылка