Pythonで文字列を並べ替えて回文を作成できるかどうかを判定する方法
文字列が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じ文字列)を作成できるかどうかを判定する問題について解説します。
例えば、入力が s = "aarcrce" の場合、文字を並べ替えて "racecar" を作ることができるため、出力は True になります。
考え方
回文になるための条件はシンプルです。各文字の出現回数に着目すると、以下のようになります。
- 文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。
- 文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、残りはすべて偶数回出現する必要があります。
つまり、「奇数回出現する文字の種類数が1以下」であれば、並べ替えて回文を作成できます。
アルゴリズムの手順
- 頻度カウント用の配列 freq をサイズ256(ASCII文字対応)で0初期化します。
- 文字列 s の各文字について、freq 配列内の出現回数を1ずつ増やします。
- odd_count を0で初期化し、freq 配列を走査して奇数回出現する文字をカウントします。
- odd_count が1を超えた時点で False を返します。
- 最後まで問題なければ True を返します。
実装例
size = 256
def solve(s):
freq = [0] * size
for i in range(len(s)):
freq[ord(s[i])] += 1
odd_count = 0
for i in range(size):
if freq[i] % 2 == 1:
odd_count += 1
if odd_count > 1:
return False
return True
s = "aarcrce"
print(solve(s))入力
"aarcrce"
出力
True
計算量
このアルゴリズムの時間計算量は O(n)(nは文字列の長さ)、空間計算量は O(1)(固定サイズ256の配列を使用)となります。非常に効率的な手法です。
まとめ
文字の出現頻度をカウントし、奇数回出現する文字が高々1種類であることを確認するだけで、回文への並べ替え可能性を判定できます。collections.Counter を使えば、さらに簡潔に記述することも可能です。
-
指定された文字列が母音回文であるかどうかを確認するPythonプログラム
はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも
-
Pythonで文字列がfloatに変換可能かどうかを判定する方法
Pythonでは、文字列がfloat(浮動小数点数)として有効かどうかを確認したい場面がよくあります。最もシンプルで確実な方法は、float()関数をtry-exceptブロックで囲むことです。 基本的な変換方法 文字列をfloatに変換するには、次のように記述します。 try: print(float(112.15)) except ValueError: print(Cannot parse) このコードを実行すると、以下の出力が得られます。 112.15 変換できない場合の挙動 もし文字列が数値として解析できない場合(例えば abc のような文字列)、ValueError