在c ++中排列2个字符串

时间:2014-02-05 18:06:46

标签: c++ algorithm permutation

我想编写一个程序,它提供2个字符串(char类型)并以不同的方式组合它们。 例如,如果2个字符串是“abc”和“mn”,程序应该打印: abcmn abmnc amnbc mnabc mabcn mannbc mabnc ambnc ambcn abmcn。 如您所见,它们应该在每个字符串中以有序的形式出现。我的意思是例如“c”不能在“a”或“n”之前不能在“m”之前。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

由于我对c++了解不多,我无法写出这个问题的完整代码,但我将在下面描述这个想法和算法。

由于我们需要在每个字符串中保持字符的顺序,我们可以考虑构建这样的组合的过程(使用示例abcmn):


  • 让我们考虑每个可能组合中的最后一个元素: 它是cn。所以我们可以构建一个包含两个元素的列表 列表:[['c'];['n']]

  • 然后让我们看看倒数第二个元素:

    如果c是最后一个元素,那么可能的倒数第二个元素 是bn,对吧?

    如果n是最后一个元素,那么可能的倒数第二个元素 是cm,对吧?

    所以让我们将之前的列表扩展到 [['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)