Pythonで有効な回文(パリンドローム)を判定する方法
問題の概要
英数字や記号が混在した文字列を考えます。文字列には小文字と大文字の両方が含まれています。ここでは、小文字のみを対象とし(大文字はすべて小文字に変換)、カンマやスペースなどの記号は無視して、その文字列が回文(前から読んでも後ろから読んでも同じ並び)になっているかどうかを判定します。
たとえば、文字列が "A Man, a Plan, a Canal: Panama" の場合、これらのルールを適用すると "amanaplanacanalpanama" となります。これは回文です。
解き方の手順
- 空文字列 x = "" を定義する
- 文字列 str 内の各文字 c を順番に読み取る
- c が小文字のアルファベットまたは数字であれば、そのまま x に追加する
- c が大文字のアルファベットであれば、小文字に変換してから x に追加する
- x が回文であれば True を、そうでなければ False を返す
実装例
以下のコードを見ると、処理の流れがより理解しやすくなります。
class Solution(object):
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
x = ""
diff = ord('a') - ord('A')
for i in s:
if ord(i)>=ord('a') and ord(i)<=ord('z') or ord(i)>=ord("0") and ord(i)<=ord("9"):
x+=i
elif ord(i)>=ord('A') and ord(i)<=ord('Z'):
i = chr(diff+ord(i))
x+=i
return x == x[::-1]
ob1 = Solution()
print(ob1.isPalindrome("A Man, a Plan, a Canal: Panama"))
入力
s = "A Man, a Plan, a Canal: Panama"
出力
true
コードのポイント
この実装では、ord関数で各文字のASCIIコードを取得し、文字の種類を判別しています。変数 diff には 'a' と 'A' の文字コードの差(32)が格納されており、大文字を小文字へ変換する際に利用されます。最後に、スライス表記 x[::-1] で反転させた文字列と比較することで、回文かどうかを判定しています。
よりPythonicな書き方
Pythonでは、isalnumメソッドとlowerメソッドを組み合わせることで、上記の処理をさらに簡潔に記述できます。
class Solution(object):
def isPalindrome(self, s):
filtered = [c.lower() for c in s if c.isalnum()]
return filtered == filtered[::-1]
リスト内包表記で英数字だけを取り出して小文字化し、反転結果と比較するだけで、同じ処理が数行で実現できます。可読性も高いため、実際の開発ではこちらの書き方が推奨されます。
-
Pythonで整数が回文数(パリンドローム)かどうかを判定する方法
整数が与えられたとき、それが回文数(パリンドローム)であるかどうかを判定する方法を解説します。回文数とは、前から読んでも後ろから読んでも同じ並びになる数値のことです。例えば「454」は逆順にしても「454」となるため回文数です。一方、「-565」を逆順にすると「565-」となり、マイナス記号の位置が変わるため元の数と一致せず、回文数にはなりません。解法の考え方この問題は非常にシンプルに解けます。手順は以下の通りです。1. 数値をstr()で文字列に変換する2. Pythonのスライス記法[::-1]を使って文字列を反転させる3. 元の文字列と反転した文字列を比較し、一致すればTrue、一致しな
-
Pythonで文字列が回文(パリンドローム)かどうかを判定する方法
文字列が与えられたとき、その文字列が回文(パリンドローム)であるかどうかを判定するのが、本記事の目的です。 回文とは、「madam」「level」「しんぶんし」のように、前から読んでも後ろから読んでも同じになる文字列のことを指します。Pythonでは、スライス記法を使うことで、わずか数行のコードでこの判定を実装できます。 アルゴリズム Step1: 文字列を入力として受け取る。 Step2: スライスを使って文字列を逆順にし、元の文字列と比較する。 Step3: 判定結果を表示する。 ポイント解説:スライスによる文字列の反転 このプログラムの核心は [::-1] というスライス記法です。こ