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

Pythonで文字列の接頭辞・接尾辞が回文かどうかを判定する方法

文字列 s が与えられたとき、その文字列の接頭辞(プレフィックス)および接尾辞(サフィックス)となる部分文字列が回文になっているかどうかを判定します。

たとえば、入力が s = "levelishighforracecar" の場合、接頭辞に「level」、接尾辞に「racecar」という回文がそれぞれ存在するため、出力は True になります。

解決の手順

この問題は、以下の手順で解くことができます。

  1. l に文字列 s の長さを代入します。
  2. i を 2 から l まで繰り返します。先頭からインデックス i までの部分文字列が回文であれば、ループを抜けます。
  3. 回文となる接頭辞が見つからなかった場合は False を返します。
  4. 再び i を 2 から l まで繰り返します。末尾側のインデックス (l - i) から (l - 1) までの部分文字列が回文であれば、True を返します。
  5. どちらにも該当しない場合は False を返します。

それでは、実際の実装を見て理解を深めましょう。

実装例(サンプルコード)

def is_palindrome(s):
    return s == s[::-1]

def solve(s):
    l = len(s)
    for i in range(2, l + 1):
        if is_palindrome(s[0:i]):
            break

    if i == (l + 1):
        return False

    for i in range(2, l + 1):
        if is_palindrome(s[l - i : l]):
            return True

    return False

s = "levelishighforracecar"
print(solve(s))

コードの解説

is_palindrome 関数は、スライス記法 s[::-1] を使って文字列を反転させ、元の文字列と一致するかどうかで回文判定を行っています。非常にシンプルで Python らしい書き方です。

solve 関数では、まず前半のループで「長さ 2 以上の回文となっている接頭辞」を先頭から順に探索します。回文が見つかれば break でループを終了し、後半の処理に進みます。後半のループでは、末尾から順に「長さ 2 以上の回文となっている接尾辞」を探索し、見つかった時点で True を返します。

入力

"levelishighforracecar"

出力

True

このように、スライスを活用したシンプルな回文判定関数と二段階のループを組み合わせることで、文字列の接頭辞・接尾辞に回文が存在するかどうかを簡単に判定できます。

  1. Pythonで文字列が英数字のみかどうかを判定する方法【isalnum()と正規表現】

    Pythonでは、文字列が英数字(アルファベットと数字)のみで構成されているかどうかを簡単に判定できます。主な方法は2つあります。文字列クラスに組み込まれている isalnum() メソッドを使う方法と、正規表現を使う方法です。 isalnum()メソッドを使う方法 Pythonの文字列クラスには isalnum() というメソッドが用意されています。このメソッドを文字列に対して呼び出すと、文字列が英数字のみで構成されている場合に True を、記号などが含まれる場合には False を返します。 >>> 123abc.isalnum() True >>>

  2. Pythonで文字列が指定した接尾辞(サフィックス)で終わっているかどうかを確認する方法

    endswith()メソッドを使う方法Pythonでは、文字列クラスに用意されている endswith() メソッドを使うことで、文字列が特定の接尾辞(サフィックス)で終わっているかどうかを簡単に確認できます。このメソッドは、検索したい接尾辞の文字列を引数として受け取り、文字列オブジェクトに対して呼び出します。以下のように使用します。string = C:/Users/TutorialsPoint1/~.py print(string.endswith(.py))実行結果:Trueこの例では、ファイルパスの文字列が .py という拡張子で終わっているため、True が返されます。もし終わってい