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

【Python入門】文字列の中から最初の繰り返しのない文字を見つける2つの方法

この記事では、文字列や文字のストリームの中から最初に現れる繰り返しのない文字(ユニークな文字)を見つける方法を解説します。この問題には複数のアプローチがあり、本稿では同じ文字列に対して2つの異なるプログラムを作成して比較してみます。

方法1:関数と辞書を使う方法(O(n)アルゴリズム)

まずは、辞書(dict)を使って各文字の出現回数をカウントし、出現順序も保持する効率的な関数ベースの方法です。

def firstNonRepeatingChar(str1):
    char_order = []
    counts = {}
    for c in str1:
        if c in counts:
            counts[c] += 1
        else:
            counts[c] = 1
            char_order.append(c)
    for c in char_order:
        if counts[c] == 1:
            return c
    return None

print(firstNonRepeatingChar('PythonforallPythonMustforall'))
print(firstNonRepeatingChar('tutorialspointfordeveloper'))
print(firstNonRepeatingChar('AABBCC'))

実行結果

M
u
None

このプログラムの計算量はO(n)であり、非常に効率的です。処理の流れは以下の通りです。

  1. まず文字列を一度だけループで走査します。
  2. 初めて見つかる文字であれば、counts辞書に値「1」で登録し、同時にchar_orderリストに出現順に追加します。
  3. すでに存在する文字が出てきた場合は、countsの値を1ずつ増やしていきます。
  4. 最後にchar_orderを順番に確認し、カウントが「1」の文字が見つかった時点でそれを返します。

すべての文字が繰り返しを含む場合(例:「AABBCC」)は、Noneが返される点にも注目してください。

方法2:whileループとreplace()を使う方法

次に、より直感的なアプローチとして、whileループと文字列のreplace()メソッドを組み合わせた方法を紹介します。

s = "tutorialspointfordeveloper"
while s != "":
    slen0 = len(s)
    ch = s[0]
    s = s.replace(ch, "")
    slen1 = len(s)
    if slen1 == slen0 - 1:
        print("最初の繰り返しのない文字は: ", ch)
        break
else:
    print("ユニークな文字が見つかりませんでした!")

実行結果

最初の繰り返しのない文字は:  u

このプログラムでは、先頭の1文字を取り出して文字列全体から削除し、削除前後の長さを比較しています。長さがちょうど1だけ減っていれば、その文字は1回しか出現していなかったことになるため、それが答えとなります。

まとめ

方法特徴
方法1(関数+辞書)O(n)で高速。大規模な文字列に適しており、繰り返しがない場合はNoneを返せる
方法2(whileループ)コードがシンプルで直感的だが、replace処理のため文字列が長いと非効率になりやすい

実務ではパフォーマンスを考慮して方法1のO(n)アルゴリズムを採用するのが一般的です。ただし、小規模な文字列や学習目的であれば、方法2のようなシンプルな実装も理解しておくと良いでしょう。

  1. Pythonで行列の転置を求めるプログラム

    この記事では、与えられた問題に対する解法とアプローチについて詳しく解説します。 問題文 ある行列が与えられたとき、その転置を同じ行列に格納し、結果を表示する必要があります。 行列の転置とは、行を列に、列を行に入れ替えたものです。言い換えれば、行列Aの転置は、要素A[i][j]をA[j][i]と入れ替えることで得られます。 実装例 N = 4 def transpose(A): for i in range(N): for j in range(i+1, N): A[i][j], A[j][i] = A[j][i], A[i][j] # ドライ

  2. Pythonで配列(リスト)の合計を求める方法をわかりやすく解説

    この記事では、配列(リスト)の合計値を求めるという問題に対して、Pythonでの解決策とアプローチをわかりやすく解説します。 問題の定義 配列が入力として与えられたとき、その配列に含まれるすべての要素の合計を計算することを目標とします。 例えば、[1, 2, 3, 4, 5] という配列が与えられた場合、出力は 15 になります。 アプローチ1:ループを使った素朴な方法(総当たり法) 最も基本的な方法は、リストを先頭から順に走査し、各要素を合計用の変数に加算していくやり方です。手順は以下の通りです。 合計を格納する変数を 0 で初期化します。 for ループでリストの各要素を取り出し、順番に