Найдите самую короткую чередованную строку A и B с динамическим программированием

У меня проблема с вопросом о динамическом программировании.

По двум строкам A и B найдите самую короткую чередованную строку из двух.

Например для A = "APPLE", B = "ABSOLUTE"

Самый короткий ответ будет "ABPPSOLUTE"Вместо ответа моя функция возвращает "APPABSOLUTE"

Моя идея решить эту проблему состояла в том, чтобы чередовать A[0] и B[0] постоянно len(A)+len(B) раз Но это не сработало.

1 ответ

Решение

Вот несколько идей, с чего можно начать.

Вики-тег для динамического программирования описывает его как:

Динамическое программирование - это алгоритмический метод для эффективного решения задач с рекурсивной структурой, содержащей много перекрывающихся подзадач

Итак, сначала попробуйте придумать способ рекурсивного решения проблемы. Задайте вопрос: "Как я могу откусить небольшую часть этой проблемы и обработать ее таким образом, чтобы то, что я оставил, было еще одним примером проблемы"?

В этом случае "маленький кусочек" будет одним символом, а оставшийся символ будет оставшимися символами в строке. Думайте о проблеме как о том, "каково самое короткое чередование символов этих двух строк, начиная с позиции X строки A и позиции Y строки B"? Когда вы называете это изначально, X и Y равны 0.

Три возможных ответа на этот вопрос:

  • Если X не находится в конце A, уберите символ A[X] из строки A, затем рекурсивно решите задачу для X+1,Y (найдите кратчайшее чередование двух строк, начиная с X+1,Y)
  • Как и выше, но взятие символа из строки B вместо A и рекурсивное решение для X,Y+1
  • В случае, когда символы A[X] и B[Y] идентичны, снимите оба символа и найдите решение для X+1,Y+1

Если X и Y достигли конца A и B, вернуть пустую строку.

Верните самую короткую строку из вышеуказанных 3, добавленную к символу из A или B (или обоих), которые вы сняли.

Когда функция вернется с верхнего уровня, у вас должен быть свой ответ.

Это "рекурсивная" часть. "Перекрывающиеся подзадачи" касаются того, как вы повторно используете то, что уже рассчитали. В этом случае вы можете создать двумерный массив строк, который представляет решаемую проблему для всех возможных значений X и Y, и при входе в функцию проверьте, есть ли у вас уже ответ, и просто верните его, если вы это сделаете. Если нет, то обработайте его, как описано выше, и перед возвращением из функции сохраните значение, которое вы собираетесь вернуть, в массиве в местоположении [X][Y].

Другие вопросы по тегам