Re: すべての文字を各1回使ってできる文字列パターン

すべての文字を各1回使ってできる文字列パターン - テックノート@ama-ch http://d.hatena.ne.jp/ama-ch/20080523/1211529804

オリジナル:

def pat(arr, level=0, base=""):
    num = len(arr)
    if num == 0:
        print base
    for i in range(num + level):
        if num > i:
            arrclone = arr.replace(arr[i], "")
            pat(arrclone, level+1, base+arr[i])

いらないところを削ってみた。

def pat(arr, base=""):
    num = len(arr)
    if num == 0:
        print base
    for i in range(num):
        arrclone = arr.replace(arr[i], "")
        pat(arrclone, base+arr[i])

あと名前を僕好みに変更してみた。

>>> def make_permutation(chars, base=""):
    if not chars:
	print base
    else:
        for i in range(len(chars)):
            new_chars = chars.replace(chars[i], "")
            make_permutation(new_chars, base + chars[i])

            
>>> make_permutation("abc")
abc
acb
bac
bca
cab
cba

でも元の問題の仕様を読んでないのだけど、文字列のreplaceを使う方法だと同じ文字が複数含まれると問題が起きるよね。

>>> make_permutation("aab")
ab
ab
ba
ba

replaceは個数を指定できるので、1個しか置換しないようにすれば一応結果は出るけど、1つ目のaが先に来るaabと2つ目のが先に来るaabの両方が表示されるね。

-            new_chars = chars.replace(chars[i], "")
+            new_chars = chars.replace(chars[i], "", 1)

あ、そんなことをしている場合じゃなかった。続きはまた今度。