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

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

本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。

問題の概要

文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。

アプローチ

この問題は、以下のような手順で効率的に解くことができます。

  • ブール値の配列を用意する: 各インデックス i が「アルファベット(ASCIIコード)における文字 i が文字列内に出現済みかどうか」を表すフラグとして機能します。

  • 重複を検知したら即座にFalseを返す: 同じ文字に2回目に遭遇した時点で、その文字列は一意性を満たしていないため、処理を中断してFalseを返します。

  • 文字数による事前チェック: 文字列の長さが、アルファベットに存在する一意な文字の総数(ここでは128種類のASCII文字)を超えている場合は、必ず重複が発生するため、その時点でFalseを返します。

この実装では、扱う文字列の最大長を256文字と想定しています。これはASCII文字セットの範囲をカバーするためです。

実装例

それでは、実際のコードを見てみましょう。

def isUniqueChars(st):
    if len(st) > 256:
        return False
    # 初期化
    char_set = [False] * 128
    # char_set を使って出現済み文字を記録
    for i in range(0, len(st)):
        # ASCII値を取得
        val = ord(st[i])
        if char_set[val]:
            return False
        char_set[val] = True
    return True
# メイン処理
st = "tutorialspoint"
print(isUniqueChars(st))

実行結果

False

上記のコードでは、変数 char_set によって各文字の出現状況を管理しています。ord() 関数で取得したASCII値をインデックスとして使い、すでにTrueになっている位置にアクセスした場合は重複と判断されます。「tutorialspoint」には「t」や「i」などが複数回登場するため、結果はFalseになります。

計算量について

この手法の時間計算量は O(n)(nは文字列の長さ)、空間計算量は O(1) です。フラグ用の配列サイズが固定されているため、入力の長さに関わらずメモリ使用量が一定に保たれる点が大きな利点です。

まとめ

本記事では、ブール値の配列を活用することで、文字列がすべて一意な文字で構成されているかどうかを効率的に判定する方法を学びました。シンプルでありながら高速に動作する定番テクニックなので、面接対策や実務でも役立つでしょう。

  1. Pythonのisnumeric()メソッドでUnicode文字列が数字のみかどうか判定する方法

    PythonでUnicode文字列に数字(数値)だけが含まれているかどうかを確認したい場合、isnumeric() メソッドを使うのが便利です。このメソッドは、文字列がすべて数値として扱える文字で構成されている場合に True を返し、それ以外の場合は False を返します。 isnumeric() はUnicode文字列専用に用意された特殊なメソッドで、半角数字だけでなく、全角数字や漢数字(一、二、三など)といったUnicode上の数値文字も判定対象になります。 使用例 print(u1234.isnumeric()) print(u1,a234.isnumeric()) 実行結果 Tru

  2. Pythonで文字列に特定の文字のみが含まれているかを確認する方法

    Pythonでは、文字列が特定の文字だけで構成されているかどうかを簡単にチェックできます。代表的な方法として、セット(set)を使う方法と正規表現(regex)を使う方法の2つがあります。それぞれ具体的なコード例とともに解説します。方法1:セット(set)を使った確認まず、許可したい文字の集合(セット)を宣言します。そして、検証したい文字列から作ったセットが、その許可セットの部分集合になっているかを確認します。例えば、文字列に「1」「2」「3」「4」のみが含まれているかをチェックしたい場合は、次のように書きます。allowed_chars = set(1234) validation_stri