Вопрос просто задавался вопросом о том, существует ли рекурсивный алгоритм для этой задачи, и ответ - да.Чтобы найти его, найдите базовый случай, а затем «шаг».
Базовый случай, когда одна из двух строк пуста:
interleave(s1, "")
= {s1}
interleave("", s2)
= {s2}
Обратите внимание, что порядок аргументов на самом деле не имеет значения, потому что
interleave("ab", "12")
= {"ab12", "a1b2", "1ab2", "a12b", "1a2b", "12ab"} = interleave("12", "ab")
Так как порядок не имеет значения, мы посмотрим на повторение по длине первой строки.
Хорошо, давайте посмотрим, как один случай приводит к следующему.Я просто использую конкретный пример, и вы можете обобщить это для реального кода.
interleave("", "abc")
= {"abc"} interleave("1", "abc")
= {"1abc", "a1bc", "ab1c", "abc1"} interleave("12", "abc")
= {"12abc", "1a2bc", "1ab2c", "1abc2", "a12bc", "a1b2c", "a1bc2"," ab12c "," ab1c2 "" abc12 "}
Поэтому каждый раз, когда мы добавляли символ в первую строку, мы формировали новый набор результатов, добавляя новый символ ко всем возможным позициям встарый набор результатов.Давайте посмотрим, как именно мы сформировали третий результат выше второго.Как каждый элемент во втором результате превратился в элементы третьего результата, когда мы добавили «2»?
- «1abc» => «12abc», «1a2bc», «1ab2c», "1abc2 "
- " a1bc "=>" a12bc "," a1b2c "," a1bc2 "
- " ab1c "=>" ab12c "," ab1c2 "
- " abc1"=>" abc12 "
Теперь посмотрите на вещи следующим образом:
- " 1abc "=> {1 w |w = interleave ("2", "abc")}
- "a1bc" => {a1 w |w = interleave ("2", "bc")}
- "ab1c" => {ab1 w |w = interleave ("2", "c")}
- "abc1" => {abc1 w |w = interleave ("2", "")}
Хотя один или два примера не подтверждают правило в целом, в этом случае вы должны быть в состоянии вывести, что это за правило.У вас будет цикл с рекурсивными вызовами внутри него.
На самом деле это немного более интересно делать с чисто функциональным программированием, но вы пометили вопрос с помощью Java.
Надеюсь, этоначать для вас.Если вы застряли дальше, вы можете выполнить поиск в сети для «чередования строк» или «чередования списков».Есть несколько решений.
РЕДАКТИРОВАТЬ :
Хорошо, я только что написал глупость!Очень интересно писать эти вещи на языках сценариев, поэтому я подумал, что было бы здорово увидеть, как это выглядит в Java.Не так плохо, как я думал, что будет!Вот он, упакованный как целое Java-приложение.
import java.util.ArrayList;
import java.util.List;
public class Interleaver {
/**
* Returns a list containing all possible interleavings of two strings.
* The order of the characters within the strings is preserved.
*/
public static List<String> interleave(String s, String t) {
List<String> result = new ArrayList<String>();
if (t.isEmpty()) {
result.add(s);
} else if (s.isEmpty()) {
result.add(t);
} else {
for (int i = 0; i <= s.length(); i++) {
char c = t.charAt(0);
String left = s.substring(0, i);
String right = s.substring(i);
for (String u : interleave(right, t.substring(1))) {
result.add(left + c + u);
}
}
}
return result;
}
/**
* Prints some example interleavings to stdout.
*/
public static void main(String[] args) {
System.out.println(interleave("", ""));
System.out.println(interleave("a", ""));
System.out.println(interleave("", "1"));
System.out.println(interleave("a", "1"));
System.out.println(interleave("ab", "1"));
System.out.println(interleave("ab", "12"));
System.out.println(interleave("abc", "12"));
System.out.println(interleave("ab", "1234"));
}
}