Pythonで数値Nから回文文字列を作成できるか判定する方法
問題の概要
ある数値 n が与えられたとき、その数値をもとに小文字アルファベットだけで構成される文字列を作成し、その文字列が回文(前から読んでも後ろから読んでも同じ文字列)になっているかどうかを判定します。
ここで使用できる文字は a から j までに限定され、各文字は次のように数字に対応付けられます。
[a = 0, b = 1, c = 2 ... j = 9]
例えば、数値が 42 の場合、各桁の合計は 4 + 2 = 6 となるため、対応する文字列「ec」を繰り返して 6 文字の「ececec」を生成し、これが回文かどうかを確認します。
入力が n = 43 の場合、出力は True になります。このとき生成される文字列は「ededede」であり、これは回文だからです。
解決の手順
この問題を解くために、以下の手順に従います。
- temp に空文字列を設定する
- s に n を文字列化したものを代入する
- letters に a から j までのすべての文字を設定する
- sum に 0 を代入する
- substr に空文字列を設定する
- i が 0 から s の長さ - 1 までの範囲で以下を繰り返す
- d に s[i] を数値化した値を代入する
- substr に letters[d] を連結する
- sum に d を加算する
- temp の長さが sum 以下である間、temp に substr を連結し続ける
- temp を先頭から sum 文字目までに切り詰める
- temp が回文であれば true を、そうでなければ false を返す
実装例
理解を深めるために、以下の実装例を見てみましょう。
def isPalindrome(s):
return s == s[::-1]
def solve(n):
temp = ""
s = str(n)
letters = "abcdefghij"
sum = 0
substr = ""
for i in range(len(s)):
d = int(s[i])
substr += letters[d]
sum += d
while len(temp) <= sum:
temp += substr
temp = temp[:sum]
return isPalindrome(temp)
n = 43
print(solve(n))
入力
43
出力
True
コードの解説
このプログラムの動作を簡単に整理してみましょう。
- isPalindrome 関数: スライス
s[::-1]を使って文字列を反転させ、元の文字列と比較することで回文かどうかを判定します。 - 各桁の変換: solve 関数内では、数値 n を文字列に変換した上で、各桁に対応するアルファベット(0→a、1→b、…)を substr に順番に連結していきます。同時に、各桁の合計値 sum も計算しています。
- 文字列の生成: substr を繰り返し連結して temp を構築し、最後に先頭から sum 文字だけを切り取ります。これにより、ちょうど桁の合計と同じ長さの文字列が得られます。
- 回文判定: 最終的に生成された temp が回文であれば True を、そうでなければ False を返します。
このように、数値の各桁を文字へマッピングしながら合計桁数分の文字列を組み立てることで、シンプルな処理で回文判定を実現できます。
-
指定された文字列が母音回文であるかどうかを確認するPythonプログラム
はじめに この記事では、「与えられた文字列から子音をすべて取り除いたとき、残った母音だけの文字列が回文になっているかどうかを判定する」という問題を、Pythonプログラムで解く方法を解説します。 問題の概要 問題文:母音と子音の両方を含む文字列が与えられます。まず文字列からすべての子音を取り除き、その結果得られた文字列が回文(前から読んでも後ろから読んでも同じ並びになる文字列)であるかどうかを確認してください。 解決のアプローチ この問題は、以下の手順で解くことができます。 元の文字列を先頭から順に走査し、母音(a・e・i・o・u)だけを取り出して新しい文字列を作成します。 母音が1つも
-
Pythonで文字列からすべての有効なIPアドレスの組み合わせを生成する方法
数字のみで構成された文字列が与えられたとき、そこから生成できるすべての有効なIPアドレスの組み合わせを求めるのが本記事の目的です。 基本的な考え方は、まず文字列の長さを確認し、その後に「.(ドット)」を挿入する位置を3か所選んで分割します。ドットの挿入位置の組み合わせをすべて試すことで、有効なIPアドレスを網羅的に抽出できます。 実行例 Input : 255011123222 → 有効なIPアドレスとして成立しない場合もある Input : 255011345890 → 有効なIPアドレス: 255.011.123.222 アルゴリズム Step 1: まず文字列の長さを確認する。 S