Pythonで文字列の前半と後半が同じ文字セットを持つかどうかを判定する方法
文字列が与えられたとき、その前半と後半がまったく同じ文字の集合を持っているかどうかを判定するのが、この記事のテーマです。
解き方はシンプルです。まず文字列を中央で分割して2つの半分を作り、それぞれの半分に含まれる文字の種類と出現回数を比較します。もし文字列の長さが奇数の場合は、中央の1文字を無視し、残りの部分だけで判定を行います。
アルゴリズムの手順
- ステップ1: 対象となる文字列を受け取ります。
- ステップ2: 入力文字列を中央で2つの部分に分割します。
- ステップ3:
Counter(iterator)メソッドを使い、両方の部分をそれぞれ辞書(Counterオブジェクト)に変換します。各辞書は「文字をキー、出現頻度を値」として保持します。 - ステップ4: 2つの辞書を
==演算子で比較します。まず両方の辞書のキー(文字の種類)が一致しているかを確認し、次に各キーに対応する値(出現回数)が一致しているかを確認します。両方が成立すれば、2つの半分は同じ文字集合を持つと判断できます。
サンプルコード
from collections import Counter
def checkhalves(s):
length = len(s)
if length % 2 != 0:
# 長さが奇数の場合は中央の1文字をスキップ
first = s[0:int(length / 2)]
second = s[(int(length / 2)) + 1:]
else:
first = s[0:int(length / 2)]
second = s[int(length / 2):]
if Counter(first) == Counter(second):
print("両方の半分は同じ文字セットです")
else:
print("両方の半分は同じ文字セットではありません")
# ドライバープログラム
if __name__ == "__main__":
text = input("文字列を入力してください: ")
checkhalves(text)コードのポイント
- 変数名を
inputからsやtextに変更しています。組み込み関数input()を上書きしてしまうと、以降の標準入力が使えなくなるためです。 Counter同士の比較は、キーと値の両方が一致した場合のみTrueを返すため、文字の出現順序に関係なく正しく判定できます。
実行結果
文字列を入力してください: abba
両方の半分は同じ文字セットですこの例では、abba の前半「ab」と後半「ba」はどちらも {a: 1, b: 1} という同じ文字集合になるため、「同じ」と判定されます。
-
Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法
本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列
-
【Python】文字列がすべてユニークな文字で構成されているか判定する方法
本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS