Привет!
Пытаюсь решить следующую задачу, найденную на одном из форумов:
Две строки могут быть перемешаны путем вставки символов первой строки между символами второй (с сохранением их порядка). Рассмотрим перемешивание двух одинаковых строк - близнецов.
Например, строка AAABAB может быть получена путем перемешивания двух строк AAB.
Дается строка, необходимо определить, могла ли она быть получена путем перемешивания двух некоторых строк-близнецов.
(другими словами, можно ли вычеркнуть половину символов так, чтобы строки, образованные вычеркнутыми и оставшимися символами, совпадали)
Логичная предпроверка: необходима четность каждого символа (XOR всех символов == 0).
Далее, ничего не удается придумать, кроме полного рекурсивного перебора O(2^N) :(
Как можно решить задачу более эффективно?
UPD: не работает на тесте AABAAB
Если правильно понял, на тривиальном тесте AABAAB такое решение дает неверный ответ? Похоже, что в остальных случаях работает, доказать бы корректность.. :)
Note that the first letter of the given string also has to be the first letter of each twin. We can remove the first two copies of that letter, and then recurse. This should give an O(n) algorithm if implemented efficiently.
Edit: it appears this problem is NP-hard. My solution is wrong.
I've posted similar solution to the russian branch. But if I understand you correctly, your solution fails on the test "ABCCAB". Answer for this test is "no"
No, maybe I didn't explain my solution well enough. Here is pseudocode of my idea:
edit: fixed a bug in pseudocode
edit: I'm wrong, sorry.
You won't be able to solve this problem efficiently, unless P=NP. Link
Thank you for the link. Haven't found it, very interesting
N^2. Идем циклом от i=1 до n-n/2+1(строки нумеруются с 1). Вырезаем строку которая начинается в позиции i длинной n/2. Если после склейки оставшихся символом будет такая же строка, то ответ yes. Если в конце не нашло ответа то ответ no. Можно все делать посимвольно, тогда решение будет работать быстрее.
upd. Условия я читать не умею, не ту задачу делал.
Придумался контр-пример: AABBCC (решение не учитывает множественного вложения одной строки в другую)
Ну все же не O(2^n), а C(n / 2, n). Просто в переборе, если взяли n/2 элементов, дальше не идем :). Небольшая оптимизация.
то есть для строки AABBCC ответ утвердительный — зачеркиваем все символы на четных/нечетных местах?
Да, все так
upd. Удалено, не работает.