【Python】文字列の前半と後半が同じ文字セット(出現回数)を持つかどうかを判定する方法
この記事では、Pythonを使って「文字列を前半と後半に分けたとき、両方の部分に同じ文字が同じ回数だけ含まれているか」を判定する方法を解説します。重要なポイントは、文字の種類だけでなく出現回数(頻度)も完全に一致している必要があるという点です。また、文字列の長さが奇数の場合は、中央の1文字を無視して残りの文字だけで判定します。
それでは、プログラムを作成するための手順を見ていきましょう。
アルゴリズム
1. 文字列を初期化する。
2. 空の辞書変数 alphabets を用意する。
3. 変数 mid を「文字列の長さ ÷ 2」で初期化する。
4. 先頭から mid の位置までループ処理を行う。
4.1. その文字が辞書に存在しない場合は、alphabets[char] を 1 で初期化する。
4.2. すでに存在する場合は、カウントを +1 する。
5. mid の位置から末尾までループ処理を行う。
5.1. その文字が辞書に存在するかどうかを確認する。
5.1.1. 存在していれば、該当文字のカウントを -1 する。
6. 辞書 alphabets のすべての値を走査する。
6.1. 0 以外の値がひとつでも見つかれば「No!」を出力する。
6.2. すべて 0 であれば「Yes!」を出力する。考え方はシンプルです。まず前半の各文字の出現回数を辞書に記録し、その後、後半の文字が出てくるたびに対応するカウントを減らしていきます。最終的にすべてのカウントが 0 になっていれば、前半と後半の文字構成が一致していることになります。
コード例
## 判定対象の文字列
string = "aabccbaa"
## 空の辞書を初期化
alphabets = {}
## 中央位置を計算
mid = len(string) // 2
## 前半部分の文字の出現回数をカウントするループ
for i in range(mid):
## 辞書に存在しない場合はカウントを 1 で初期化
if not alphabets.get(string[i], 0):
alphabets[string[i]] = 1
else:
## すでに存在する場合はカウントを +1
alphabets[string[i]] += 1
## 後半部分の文字が辞書に存在すればカウントを -1 するループ
for i in range(len(string) - 1, mid - 1, -1):
## その文字が後半に含まれているかを確認
if alphabets.get(string[i], 0):
## 存在していればカウントを -1
alphabets[string[i]] -= 1
## 判定用のフラグ変数を初期化
flag = 1
## カウント減算後の値をチェックするループ
for i in alphabets.values():
## 0 以外の値がないか確認
if i != 0:
## 0 以外が見つかったらループを抜けて「No!」を出力
print("No!")
flag = 0
break
## フラグが 1 のままなら、すべて一致しているので「Yes!」
if flag == 1:
print("Yes!")コードの動作イメージ
この例では、文字列 "aabccbaa" の長さは 8 なので、前半は "aabc"、後半は "cbaa" となります。
- 前半「aabc」の出現回数:a → 2 回、b → 1 回、c → 1 回
- 後半「cbaa」を順に処理すると、a・b・c のカウントがそれぞれ 0 に戻る
すべてのカウントが 0 になったため、前半と後半は同じ文字セットを持つと判定されます。
実行結果
上記のプログラムを実行すると、次のような出力が得られます。
Yes!
もし前半と後半で文字の出現回数が異なる文字列(例:"aabbcd" など)を指定した場合は、「No!」が出力されることを確認してみてください。
まとめ
本記事では、辞書(dict)を使って文字列の前半と後半の文字頻度を比較する方法を紹介しました。collections.Counter を使えば、さらに簡潔に同様の判定を実装することもできます。ぜひ応用してみてください。このチュートリアルについて不明な点や質問がある場合は、コメント欄でお気軽にお知らせください。
-
Pythonで文字列がパングラムかどうかを判定するプログラムの作成方法
本記事では、与えられた文字列がパングラムであるかどうかを判定するPythonプログラムの解法とアプローチについて詳しく解説します。 問題の概要 文字列入力が与えられたとき、その文字列がパングラムであるかどうかを判定するPythonプログラムを作成します。 パングラムとは? パングラムとは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文章や一連の単語のことです。有名な例として「The quick brown fox jumps over the lazy dog」があります。 解法のアプローチ この問題は、以下の手順で解くことができます。 アルファベット全体を表す基準となる文字列
-
【Python】文字列がすべてユニークな文字で構成されているか判定する方法
本記事では、与えられた文字列に含まれる文字がすべて一意(ユニーク)であるかどうかを判定するPythonプログラムについて、その解法とアプローチをわかりやすく解説します。 問題の概要 文字列が入力として与えられたとき、その文字列に含まれるすべての文字が重複なく一意であるかどうかを判定します。たとえば「abcde」はすべて異なる文字で構成されているためTrue、「tutorialspoint」のように同じ文字が複数回出現する場合はFalseとなります。 アプローチ この問題は、以下のような手順で効率的に解くことができます。 ブール値の配列を用意する: 各インデックス i が「アルファベット(AS