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

Pythonで文字列に含まれる回文部分文字列の数を求める方法

すべて小文字(ASCII文字)からなる文字列が与えられたとき、その文字列に含まれる連続する回文部分文字列をすべて見つけ、その総数を求めることを考えます。

たとえば、入力が「level」の場合、出力は 7 になります。「level」「eve」「l」「e」「v」「e」「l」の7つの部分文字列が回文として該当するためです。

解決のための手順

この問題は、次の手順に従って解くことができます。

  • N := 26(英小文字の種類数)とする
  • n := 文字列 str の長さとする
  • sum := 0 として初期化する
  • my_map := サイズ N のリストを作成し、すべての要素を 0 で初期化する
  • i を 0 から n-1 まで繰り返す
    • my_map[ord(str[i]) - ord('a')] の値を 1 増やす(各文字の出現回数をカウント)
  • i を 0 から N-1 まで繰り返す
    • my_map[i] が 0 以外の場合、sum に my_map[i] × (my_map[i] + 1) ÷ 2 を加算する
  • sum を返す

考え方のポイント

ある文字が文字列中に c 回出現するとき、その文字から作られる部分文字列の組み合わせは c × (c + 1) ÷ 2 通りになります。これは「c個の中から2つを選ぶ(重複可)」組み合わせの計算式です。この値を26種類の文字すべてについて合計することで、回文部分文字列の総数を効率よく求めることができます。

実装例

以下のPythonコードを見ると、処理の流れがより理解しやすくなります。

N = 26

def all_palindrome_substr_count(s):
    n = len(s)
    total = 0
    my_map = [0] * N
    for i in range(n):
        my_map[ord(s[i]) - ord('a')] += 1
    for i in range(N):
        if my_map[i]:
            total += (my_map[i] * (my_map[i] + 1) // 2)
    return total

s = "level"
print(all_palindrome_substr_count(s))

入力

"level"

出力

7

  1. Pythonで文字列内に最も多く出現する文字とその出現回数を求める方法

    この記事では、文字列の中で最も多く出現する文字と、その出現回数を求める方法について、考え方と実装手順をわかりやすく解説します。 問題文 入力として与えられた文字列から、最も多く出現する文字と、その出現回数を特定します。 アプローチ Python標準ライブラリの collections.Counter を使い、「文字をキー・出現回数を値」とする辞書を作成します。 辞書の値(出現回数)の中から最大値を求め、その最大値に対応する文字を取得します。 それでは、実際の実装例を見ていきましょう。 実装例 from collections import Counter def find(input_)

  2. Pythonで文字列内のn番目に出現する部分文字列の位置を見つける方法

    Pythonでは、split()メソッドを活用することで、文字列内にn番目に出現する部分文字列の位置(インデックス)を簡単に求めることができます。基本的な考え方手順は以下の通りです。対象の部分文字列を区切り文字として、最大 n+1 回だけ文字列を分割します。分割後のリストの要素数が n+1 より大きければ、その部分文字列は少なくとも n 回以上出現していることになります。出現位置は、「元の文字列の長さ − 最後の分割部分の長さ − 部分文字列の長さ」というシンプルな式で計算できます。コード例def findnth(string, substring, n): parts = strin