ABC 009 C 辞書式順序ふたたび

qiita.com

続き。

atcoder.jp

実質リベンジみたいな。何を言っているのかは、わかる。実装はできないみたいな。まぁ、技術力不足なだけなんですけど()

以下、コードの説明。

i := T の 添字
j := i + 1 番目以降で、最も辞書的に小さい文字を探すための添字

あらかじめ、ans に、元々の文字列 S をリスト化してコピーしておく(あとあとswapしたいので、list 化)。

元々の S の i 番目よりも、辞書的に小さい文字を探して、本当に違う数が k 文字以下になるかどうか試すために、ss を用意する。 k 以下であれば、実際に、ansをスワップ。 これを繰り返すことで、違う数が k 文字以下であり尚且つ、辞書的に小さい文字列を得ることができる。

うーん、難しいなぁ。

from collections import Counter

n, k = map(int, input().split())
s = input()

ans = list(s)

for i in range(n):
    l = i
    for j in range(i+1, n):
        # 現在の i 番目の文字より小さい文字があるか探す
        if ans[l] > ans[j]:
            # あった
            ss = ans.copy()
            ss[i], ss[j] = ss[j], ss[i]
            # ss と比較したとき、違う数
            diff = 0
            for t in range(n):
                if ss[t] != s[t]:
                        diff += 1
            if diff <= k:
                l = j
    ans[i], ans[l] = ans[l], ans[i]

print("".join(ans))