Pythonで文字列を3つの回文に分割できるか判定するプログラム
文字列 s が与えられたとき、その文字列を3つの回文(palindrome)の部分文字列に分割できるかどうかを判定する問題を考えてみましょう。
たとえば、入力が s = "levelpopracecar" の場合、「level」「pop」「racecar」の3つに分割でき、これらはすべて回文であるため、出力は True になります。
解法のアプローチ
この問題は、動的計画法(DP)を用いて各部分文字列が回文かどうかを事前に計算しておくことで、効率的に解くことができます。手順は以下の通りです。
n := 文字列 s の長さ
dp := n × n の行列を作成し、すべて False で初期化する(dp[i][j] は「s[i..j] が回文であるか」を表す)
i を n-1 から 0 まで 1 ずつ減らしながら繰り返す:
j を 0 から n-1 まで繰り返す:
i >= j の場合:
dp[i][j] := True(長さ1以下の部分文字列は常に回文)
s[i] と s[j] が等しい場合:
dp[i][j] := dp[i+1][j-1](両端が一致し、かつ内側の部分文字列も回文であれば回文となる)
i を 1 から n-1 まで、j を i+1 から n-1 まで繰り返し、dp[0][i-1]、dp[i][j-1]、dp[j][n-1] がすべて True であれば:
True を返す(3つの分割位置が見つかったことを意味する)
最後まで見つからなければ False を返す
ポイントは、まず DP テーブルで「任意の区間が回文かどうか」をすべて求めておき、その後に2つの分割位置 i と j を全探索することです。これにより、文字列全体を [0, i-1]、[i, j-1]、[j, n-1] の3つの区間に分けたとき、それぞれが回文になっているかを O(1) で確認できます。計算量は O(n²) となります。
実装例
それでは、以下の Python 実装を見て理解を深めましょう。
def solve(s):
n = len(s)
dp = [[False] * n for _ in range(n)]
for i in range(n-1, -1, -1):
for j in range(n):
if i >= j:
dp[i][j] = True
elif s[i] == s[j]:
dp[i][j] = dp[i+1][j-1]
for i in range(1, n):
for j in range(i+1, n):
if dp[0][i-1] and dp[i][j-1] and dp[j][n-1]:
return True
return False
s = "levelpopracecar"
print(solve(s))
入力
"levelpopracecar"
出力
True
-
指定された文字列がキーワードであるかどうかを確認するPythonプログラム
この記事では、指定された文字列がPythonのキーワード(予約語)であるかどうかを判定する方法について解説します。問題の概要与えられた文字列が、Pythonにおけるキーワードであるかどうかを確認する必要があります。キーワードとは、言語によって特別な用途のために予約されている単語であり、変数名や関数名などの識別子として使用することはできません。例えば「if」「for」「while」「def」などはすべてキーワードです。これらの名前を変数に使おうとすると、構文エラーが発生します。解決策:keywordモジュールの活用Pythonには標準ライブラリとしてkeywordモジュールが用意されており、これ
-
文字列が空かどうかをチェックするPythonプログラム
この記事では、与えられた文字列が空であるかどうかを判定するための解決策とアプローチについて解説します。 問題文 文字列が入力として与えられたとき、その文字列が空(空文字列)であるかどうかを判定する必要があります。 Pythonの文字列はイミュータブル(変更不可)な性質を持っているため、文字列に対して何らかの操作を行う際には注意して扱う必要があります。 ここでは、上記の問題を解決するための2つのアプローチを紹介します。 len()メソッドを使用する方法 等価演算子(==)を使用する方法 アプローチ1:len()メソッドを使う方法 len()関数で文字列の長さを取得し、その長さが0であれば空文