D - String Equivalence
パナソニックプログラミングコンテストのD問題。
|s| = |t|である
この意味は、オートマトンの記号で、sとtが同じ長さの文字列であることを示す。
再帰の場合
def solve():
N = int(input())
# ord("a") Unicode コードポイントを返す
codepoint = ord("a")
# w : 標準形文字列
# i : 出力された標準形文字列の辞書順で最も遅い文字
def dfs(w, i):
# ベースケース
if len(w) == N:
print(w)
return
# 辞書順で以前に出力済の文字までを追加する
for j in range(i):
dfs(w+chr(j+codepoint), i)
# 辞書順で以前に出力済の文字 + 1まで
dfs(w + chr(i+codepoint), i + 1)
dfs("", 0)
# Solve
if __name__ == "__main__":
solve()
回答としては通りとなる。
ord()
はUnicode コードポイントを返す標準関数であり、文字列を辞書順で一文字ずつ先に進めるときに使える。
chr()
は逆。
再帰を使わない場合
def solve():
N = int(input())
# ord("a") Unicode コードポイントを返す
codepoint = ord("a")
i = 1
ans = [["a", 1]]
while i < N:
tmp = []
for w, j in ans:
for k in range(j+1):
if k != j:
tmp.append([w + chr(codepoint+k), j])
else:
tmp.append([w + chr(codepoint+k), j+1])
ans = tmp
i += 1
[print(a[0]) for a in ans]
# Solve
if __name__ == "__main__":
solve()
こんな感じになる。 幅優先探索になっている。