我想编写一个程序,它提供2个字符串(char类型)并以不同的方式组合它们。 例如,如果2个字符串是“abc”和“mn”,程序应该打印: abcmn abmnc amnbc mnabc mabcn mannbc mabnc ambnc ambcn abmcn。 如您所见,它们应该在每个字符串中以有序的形式出现。我的意思是例如“c”不能在“a”或“n”之前不能在“m”之前。 我该怎么办?
答案 0 :(得分:0)
由于我对c++
了解不多,我无法写出这个问题的完整代码,但我将在下面描述这个想法和算法。
由于我们需要在每个字符串中保持字符的顺序,我们可以考虑构建这样的组合的过程(使用示例abc
和mn
):
让我们考虑每个可能组合中的最后一个元素:
它是c
或n
。所以我们可以构建一个包含两个元素的列表
列表:[['c'];['n']]
。
然后让我们看看倒数第二个元素:
如果c
是最后一个元素,那么可能的倒数第二个元素
是b
和n
,对吧?
如果n
是最后一个元素,那么可能的倒数第二个元素
是c
和m
,对吧?
所以让我们将之前的列表扩展到
[['b';'c'];['n';'c'];['c';'n'];['m';'n']]
如果以相同的方式继续到第三个最后一个元素,我们将
[['a';'b';'c'];['n';'b';'c'];['b';'n';'c'];['m';'n';'c'];['b';'c';'n'];['m';'c';'n'];['c';'m';'n']]
继续,您将获得完整列表。
以下是ocaml代码,以防你知道函数式编程
let rec comb_2 l1 l2 =
let insert x = List.map (fun y -> x::y) in
match l1, l2 with
| [], [] -> [[]]
| hd::tl, [] | [], hd::tl -> comb_2 tl [] |> insert hd
| hd1::tl1, hd2::tl2 ->
(comb_2 tl1 l2 |> insert hd1) @ (comb_2 l1 tl2 |> insert hd2)