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

Pythonで1文字削除するだけで全文字の出現頻度を同じにできるか判定する方法

小文字のみで構成された文字列 s が与えられたとします。このとき、たった1文字を削除するだけで、すべての文字の出現頻度が等しくなるかどうかを判定する問題を考えます。

例えば、入力が s = "abbc" の場合、出力は True になります。「b」を1つ削除すれば「abc」となり、各文字の出現回数がすべて1回で揃うためです。

解法のアプローチ

この問題は、以下の手順で解くことができます。

  • まず、文字列 s 内の各文字とその出現回数を対応付けたマップ(辞書)を作成します。
  • すべての文字の出現回数がすでに同じであれば、True を返します。
  • 次に、文字列内の各文字について以下を試します。
    • その文字の出現回数を1減らす(=1文字削除をシミュレート)
    • この状態ですべての文字の出現回数が同じになれば、True を返します
    • 検証後は元に戻すため、出現回数を1増やします
  • どの1文字を削除しても頻度を揃えられなければ、False を返します。

実装例

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

from collections import defaultdict
def allSame(occurrence):
    counts = list(occurrence.values())
    return all(element == counts[0] for element in counts)
def solve(s):
    occurrence = defaultdict(int)
    for char in s:
        occurrence[char] += 1
    if allSame(occurrence):
        return True
    for char in s:
        occurrence[char] -= 1
        if allSame(occurrence):
            return True
        occurrence[char] += 1
    return False
s = "abbc"
print(solve(s))

入力

"abbc"

出力

True

計算量のポイント

このアルゴリズムでは、各文字の削除を試行するたびに出現回数の一致を再チェックするため、時間計算量は O(n × k) となります(n は文字列長、k は文字種数)。英小文字のように文字種が最大26種と限られている場合、k は定数とみなせるため、実用上は十分高速に動作します。より効率化したい場合は、collections.Counter で頻度の分布を事前に集計し、条件分岐だけで判定する O(n) の実装も可能です。

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

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

  2. 同じ文字が最低d文字以上離れるように文字列を再配置するPythonプログラム

    問題の概要 空でない文字列 str と整数 k が与えられたとき、同じ文字同士が互いに少なくとも距離 k 以上離れるように文字列を並べ替えることを考えます。 入力文字列はすべて小文字アルファベットで構成されているものとします。条件を満たす並べ替えが不可能な場合は、空文字列 "" を返します。 例1 str = tutorialspoint, k = 3 答え: tiotiotalnprsu どの文字も、同じ文字との間に少なくとも3文字以上の距離が保たれています。 str = aabbcc, k = 3 答え: abcabc 同じ文字が最低3文字分の間隔を空けて配置さ