【Python】文字列内の部分文字列の出現回数をカウントする方法
問題の概要
文字列 s と部分文字列 t が与えられたとき、t が s の中に何回出現するかを数えるプログラムを作成します。
例えば、入力が s = "abaabcaabababaab"、t = "aab" の場合、出力は 3 になります。これは ab(aab)c(aab)abab(aab) のように、部分文字列 "aab" が3箇所に存在するためです。
解決のアプローチ
この問題は、以下の手順で解決できます。
- カウンター変数
cntを 0 で初期化します。 iを 0 から(s の長さ − t の長さ)まで順にループさせます。- 各位置
iにおいて、s[i : i + len(t)]で切り出した部分文字列がtと一致するかどうかを判定します。 - 一致した場合は
cntを 1 増やします。 - ループ終了後、
cntを返します。
実装例
以下にPythonでの実装例を示します。
def solve(s, t):
cnt = 0
for i in range(0, len(s) - len(t) + 1):
if s[i:i + len(t)] == t:
cnt = cnt + 1
return cnt
s = "abaabcaabababaab"
t = "aab"
print(solve(s, t))入力と出力
入力:
"abaabcaabababaab", "aab"
出力:
3
補足: str.count() メソッドとの違い
Pythonには組み込みメソッド str.count() があり、同様の処理を1行で書くことも可能です。
s = "abaabcaabababaab" t = "aab" print(s.count(t)) # 出力: 3
ただし、両者には重要な違いがあります。str.count() は重なり合わない(オーバーラップしない)出現のみをカウントします。例えば "aaa".count("aa") の結果は 1 です。
一方、上記のスライスとループを使った方法は、開始位置を1つずつずらして照合するため、重なり合う出現もカウントできます。同じ入力 "aaa"、"aa" に対しては 2 を返します。用途に応じて適切な方法を選択しましょう。
-
Pythonでn個のノードから構成できる二分探索木(BST)の数を求める方法
問題の概要互いに異なるn個のノードが与えられたとき、それらを二分探索木(BST:Binary Search Tree)として配置する方法が何通りあるかを求めることを考えます。二分探索木には「左部分木には常に親より小さい値が、右部分木には常に親より大きい値が格納される」という重要な性質があります。この問題を解くには、カタラン数(Catalan Number)を利用します。カタラン数 C(n) は、n個の異なるキーから構成できる二分探索木の総数を正確に表すことが知られています。計算式は次のとおりです。$$C(n)=\frac{(2n)!}{(n+1)!\times n!}$$例えば、入力が n =
-
セットを使って文字列内の母音の数をカウントするPythonプログラム
本記事では、Pythonを使って文字列内に含まれる母音の数をカウントする方法について解説します。セット(set)を活用した効率的な実装を中心に、初心者の方にもわかりやすく説明していきます。 問題の概要 問題文:任意の文字列が与えられたとき、その文字列に含まれる母音の数をセットを使って数えます。 基本的なアプローチとしては、文字列全体を先頭から順に走査し、各文字が母音であるかどうかを判定します。母音であればカウントを1ずつ増やしていき、最終的な合計を出力します。 実装例 def vowel_count(str_): count = 0 # 母音をセットとして定義 vowe