@Tushe

Как преобразовать слова?

Всем привет!
Эту задачу уже поднимали на форуме, эти темы были прочитаны и , к сожалению не помогли.
Сама задача:
Условие задачи

Ограничение времени, с 1
Ограничение памяти, МБ 64
Общее число попыток отправки 15

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

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

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

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

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

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

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

Примечания по оформлению решения
При отправке решений на Java необходимо назвать исполняемый класс Main. В решении не нужно указывать пакет.

Для работы со стандартным потоком ввода в JS используйте require('readline'), а для работы со стандартным потоком вывода - console.log(String(data)).

Пример ввода-вывода на JS:

const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.on('line', (line) => {
// Введенная строка в переменной line, тут можно написать решение
console.log(String(result));
rl.close();
return;
}).on('close', () => process.exit(0));

Мое предполагаемое решение:

const readline = require("readline");
const rl = readline.createInterface(process.stdin, process.stdout);
rl.on("line", (line) => {



let result = 1;
let counter = 0;
let counterArr = 33;
let lowline = line.toLowerCase();
var arr = ["а", "б", "в", "г", "д", "е", "ё", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я"];
let wordLength = (lowline.length - 1) / 2;
let fullHouse = 0;

if ((lowline.length % 2 == 1) && (lowline[wordLength] == '  ')) { 
  result = 1;
}
else { result = 0;} //проверка на одинаковую длину

for (let i = 1; i <= wordLength; i++) {
    if (lowline[i - 1] == lowline[i + wordLength]) {
        counter++
    }
    if (counter == wordLength) {
         return result = 1;
    }
} //проверка на одинаковые слова



if (wordLength >= 33) {
for (let y = 1; y <= wordLength && result > 0; y++) {
       for (let i = 0; i <= counterArr; counterArr--) {
         if (lowline[y - 1] == arr[i]) {
             arr.splice(i,1);
             break;
         }
         else i++;
         }
                if (arr.length == 0) {fullHouse = 1;}

}
     } //проверка 1 слова на все буквы алфавита


if (wordLength >= 33) {
for (let y = wordLength + 2; y <= lowline.lenght && result > 0; y++) {
       for (let i = 0; i <= counterArr; counterArr--) {
         console.log(lowline[y-1],arr[i]);
         if (lowline[y - 1] == arr[i]) {
             arr.splice(i,1);
             break;
         }
         else i++;
         }
                if (arr.length == 0 && fullHouse == 1) {return result = 0;}

}
     } //проверка 2 слова на все буквы алфавита, если в первом и втором словах все буквы есть - result 0


    for (let i = 1; i <= wordLength && result > 0; i++) {
        for (let compare = i + 1; compare <= wordLength; compare++) {
            if (lowline[i - 1] == lowline[compare - 1]) {
                if (lowline[i + wordLength] == lowline[compare + wordLength]) {
                    result = 1;
                } else {
                    return result = 0; //ищу одинаковые символы в первой строке, сравниваю на этих же индексах буквы во втором слове
                    
                }
            }
        }
    }
    console.log(String(result));  
    rl.close();
    return;
}).on("close", () => process.exit(0));


Ломаю голову второй день, осталось 2 попытки на проверку валидатором, прошу помощи опытных людей

Спасибо!
  • Вопрос задан
  • 206 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Ответ "можно" если
1) Каждому символу первой строки соответствует один и тот же символ второй строки
2) Если есть замены в виде цикла (вроде а->б, б->в, в->а), то нужна хотя бы одна свободная буква (та, которая не стоит справа в замене).

Решается так:
1) Проверить, что строки равны. Это особый случай
2) Проверить, что длина одинаковая?
3) Завести мап символ->символ, пройтись по строкам параллельно и записывать мап[строка1[i]] = строка2[i], если там пусто. Иначе - проверить, что там уже записано то же самое.
4) Проверить, что различных символов во второй строке меньше 33. Можно с помощью сета, который наполняется в том же цикле, что и в шаге 3.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы