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

Pythonで文字列を並べ替えて回文を作成できるかどうかを判定する方法

文字列が与えられたとき、その文字を並べ替えることで回文(前から読んでも後ろから読んでも同じ文字列)を作成できるかどうかを判定する問題について解説します。

例えば、入力が s = "aarcrce" の場合、文字を並べ替えて "racecar" を作ることができるため、出力は True になります。

考え方

回文になるための条件はシンプルです。各文字の出現回数に着目すると、以下のようになります。

  • 文字列の長さが偶数の場合:すべての文字が偶数回出現する必要があります。
  • 文字列の長さが奇数の場合:ちょうど1つの文字だけが奇数回出現し、残りはすべて偶数回出現する必要があります。

つまり、「奇数回出現する文字の種類数が1以下」であれば、並べ替えて回文を作成できます。

アルゴリズムの手順

  1. 頻度カウント用の配列 freq をサイズ256(ASCII文字対応)で0初期化します。
  2. 文字列 s の各文字について、freq 配列内の出現回数を1ずつ増やします。
  3. odd_count を0で初期化し、freq 配列を走査して奇数回出現する文字をカウントします。
  4. odd_count が1を超えた時点で False を返します。
  5. 最後まで問題なければ 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 を使えば、さらに簡潔に記述することも可能です。

  1. 指定された文字列が母音回文であるかどうかを確認するPythonプログラム

    はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも

  2. Pythonで文字列がfloatに変換可能かどうかを判定する方法

    Pythonでは、文字列がfloat(浮動小数点数)として有効かどうかを確認したい場面がよくあります。最もシンプルで確実な方法は、float()関数をtry-exceptブロックで囲むことです。 基本的な変換方法 文字列をfloatに変換するには、次のように記述します。 try: print(float(112.15)) except ValueError: print(Cannot parse) このコードを実行すると、以下の出力が得られます。 112.15 変換できない場合の挙動 もし文字列が数値として解析できない場合(例えば abc のような文字列)、ValueError