Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】文字列から重複した文字を削除して一意な文字列を生成する方法

文字列 s が与えられたとき、それまでに出現したことのある文字を取り除き、各文字が1回だけ現れるように圧縮した文字列を返すことを考えます。この問題は、挿入順序を保持できる「順序付き辞書(OrderedDict)」を使うことで、シンプルかつ効率的に解くことができます。

辞書の値には各文字の出現回数(頻度)を格納しますが、今回の目的にとって頻度そのものは重要ではありません。重要なのは「どの文字が最初に登場したか」という順序の情報です。辞書が完成したら、キーを順番に取り出して連結するだけで、求める文字列が得られます。

例えば、入力が s = "cabbbaadac" の場合、出力は "cabd" となります。2回目以降に出現した文字(b、a、c など)はすべて除外され、初回出現時の順序だけが残ります。

解法のアルゴリズム

以下の手順で問題を解きます。

  • キーが挿入された順序を保持する辞書 d を用意します。
  • 文字列 s の各文字 c について、次の処理を行います。
    • c がまだ辞書 d に存在しない場合は、d[c] = 0 として登録します。
    • d[c] の値を1増やします(頻度のカウント)。
  • すべての文字を処理し終えたら、辞書のキーを先頭から順に連結した文字列を作成して返します。

実装例(Python)

理解を深めるために、実際のコードを見てみましょう。

from collections import OrderedDict

def solve(s):
    d = OrderedDict()
    for c in s:
        if c not in d:
            d[c] = 0
        d[c] += 1

    return ''.join(d.keys())

s = "cabbbaadac"
print(solve(s))

入力

"cabbbaadac"

出力

cabd

補足:より簡潔な書き方(dict.fromkeys)

Python 3.7 以降では通常の dict も挿入順序を保持するため、次のように dict.fromkeys() を使えば1行で同じ結果が得られます。

def solve(s):
    return ''.join(dict.fromkeys(s))

print(solve("cabbbaadac"))  # 出力: cabd

どちらの方法でも計算量は O(n)(n は文字列の長さ)となり、非常に高速に動作します。

  1. 【Python】文字列がすべてユニークな文字で構成されているか判定する方法

    本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS

  2. Pythonで文字列から特定の文字を削除する方法|replaceと正規表現の使い方

    replace()メソッドで文字を削除するPythonの文字列(str)クラスには、文字列内の部分文字列を置換するためのreplace()メソッドが用意されています。削除したい文字を空文字列()に置き換えることで、実質的にその文字を取り除くことができます。>>> Hello people.replace(e, ) Hllo popl複数の文字を一度に削除する:正規表現を使う1行のコードで複数の文字をまとめて削除したい場合は、正規表現を使うのが便利です。削除したい文字を「|」で区切ってパターンを指定し、re.sub(置換対象パターン, 置換後の文字列, 対象文字列)という形式で