C 中2个字符串的置换

permutation of 2 strings in c++

本文关键字:字符串 2个      更新时间:2023-10-16

我想编写一个提供2个字符串(char类型)并以不同方式组合的程序。例如,如果2个字符串是" ABC"answers" MN",则该程序应打印:ABCMN ABMNC AMNBC MNABC MABCN MANNBC MABNC AMBNC AMBCN ABMCN。如您所见,它们应该在每个字符串中以顺序形式。我的意思是,例如" C"不可能是" A"或" N"之前的" M"。我该怎么办?

我对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)