文字列/整数のすべての順列を一覧表示する 質問する

文字列/整数のすべての順列を一覧表示する 質問する

プログラミング面接でよくあるタスクは(私の面接経験からではありませんが)、文字列または整数を取得して、すべての可能な順列をリストすることです。

これがどのように行われるか、また、このような問題を解決する背後にあるロジックの例はありますか?

いくつかのコードスニペットを見ましたが、コメントや説明が不十分で、理解するのが困難でした。

ベストアンサー1

まず第一に、匂いは再帰もちろん!

あなたも原理を知りたいと思うでしょうから、人間の言葉で説明できるように最善を尽くしました。再帰はほとんどの場合とても簡単だと思います。理解する必要があるのは 2 つのステップだけです。

  1. 最初のステップ
  2. その他のすべてのステップ(すべて同じロジック)

人間の言語:

要するに:

  1. 1 つの要素の順列は 1 つの要素です。
  2. 要素セットの順列は、各要素が他の要素のすべての順列と連結されたリストです。

例:

セットに要素が 1 つだけある場合 -->
その要素を返します。
パーマ(a) -> a

セットに 2 つの文字がある場合、その中の各要素について、残りの要素の順列を追加した要素を返します。次のようになります。

パーマ(ab) ->

a + パーマ(b) ->アブ

b + パーマ(a) ->

さらに、セット内の各文字について、セットの残りの文字の順列と連結した文字を返します。

パーマ(abc) ->

a + パーマ(bc) -->アブacb

b + パーマ(ac) -->バックbca

c + パーム(ab) -->タクシーCBA

パーマ(abc...z) -->

a + perm(...)、b + perm(....)
....

私は見つけた疑似コードの上http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/:

makePermutations(permutation) {
  if (length permutation < required length) {
    for (i = min digit to max digit) {
      if (i not in permutation) {
        makePermutations(permutation+i)
      }
    }
  }
  else {
    add permutation to list
  }
}

C#

さて、もう少し複雑なもの(そしてこれはc#のタグが付いているので)からhttp://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html: かなり長いですが、とにかくコピーすることにしたので、この投稿はオリジナルに依存しません。

この関数は文字列を受け取り、その文字列のあらゆる可能な順列を書き込みます。たとえば、「ABC」が指定された場合は、次のように出力されます。

ABC、ACB、BAC、BCA、CAB、CBA。

コード:

class Program
{
    private static void Swap(ref char a, ref char b)
    {
        if (a == b) return;

        var temp = a;
        a = b;
        b = temp;
    }

    public static void GetPer(char[] list)
    {
        int x = list.Length - 1;
        GetPer(list, 0, x);
    }

    private static void GetPer(char[] list, int k, int m)
    {
        if (k == m)
        {
            Console.Write(list);
        }
        else
            for (int i = k; i <= m; i++)
            {
                   Swap(ref list[k], ref list[i]);
                   GetPer(list, k + 1, m);
                   Swap(ref list[k], ref list[i]);
            }
    }

    static void Main()
    {
        string str = "sagiv";
        char[] arr = str.ToCharArray();
        GetPer(arr);
    }
}

おすすめ記事