Pythonで「bird」に並べ替えられる長さ4の部分文字列の個数を求める方法
すべて小文字で構成された文字列 S が与えられます。このとき、文字を並べ替えると "bird" という単語になる長さ4の部分文字列が、文字列全体にいくつ含まれているかを求めます。
たとえば、入力が "birdb" の場合、出力は 2 になります。これは、先頭の「bird」と2文字目以降の「irdb」の2つの部分文字列が、それぞれ並べ替えることで "bird" を作れるためです。
解法の考え方
この問題は、次の手順で解きます。
- カウンタ変数
cntを 0 で初期化します。 iを 0 からlen(s) - 3まで動かし、長さ4の部分文字列の開始位置を順番に調べます。- 各開始位置について、'b'・'i'・'r'・'d' の出現回数を記録する配列
bird = [0, 0, 0, 0]を用意します。 jをiからi + 3まで動かしながらs[j]がどの文字かを判定し、対応する要素を 1 ずつ増やします。- 4文字分の集計が終わった時点で
birdが[1, 1, 1, 1]と一致していれば、その部分文字列は並べ替えて "bird" を作れるため、cntを 1 増やします。 - すべての位置を調べ終えたら、
cntを返します。
実装例
以下は、上記の考え方を Python で実装したコードです。
def number_of_occurrence(s):
cnt = 0
for i in range(0, len(s) - 3):
bird = [0, 0, 0, 0]
for j in range(i, i + 4):
if s[j] == 'b':
bird[0] += 1
elif s[j] == 'i':
bird[1] += 1
elif s[j] == 'r':
bird[2] += 1
elif s[j] == 'd':
bird[3] += 1
if bird == [1,1,1,1]:
cnt += 1
return cnt
s = "birdb"
print(number_of_occurrence(s))入力
"birdb"
出力
2
計算量と補足
外側のループが最大 n 回(n は文字列の長さ)、内側のループは固定の 4 回しか走らないため、全体の計算量は O(n) と非常に効率的です。
また、Python の標準ライブラリ collections.Counter を使うと、同じ処理をより簡潔に書くこともできます。
from collections import Counter
def number_of_occurrence(s):
target = Counter("bird")
return sum(Counter(s[i:i+4]) == target for i in range(len(s) - 3))どちらの方法でも、各部分文字列に含まれる 'b'・'i'・'r'・'d' がそれぞれちょうど1回ずつ現れているかどうかを判定することで、正しく個数を数えられます。
-
Pythonで2つの文字列に共通する文字の数を数える方法
Pythonでは、2つの文字列が与えられたとき、1つ目の文字列の中に含まれていて、かつ2つ目の文字列にも存在する文字の数を求めたいケースがあります。本記事では、そのような「共通する文字の個数」を数えるための2つの代表的な方法を紹介します。 set(集合)を使う方法 set() 関数を使うと、文字列から重複を除いた一意な要素(ユニークな文字)を取得できます。さらに、& 演算子(積集合)を使えば、2つの集合に共通して含まれる要素を簡単に取り出すことができます。 コード例 strA = Tutorials Point uniq_strA = set(strA) # 元の文字列 print(G
-
Pythonで文字列内の最初に繰り返される単語を見つける方法
文字列が1つ与えられ、その中で最初に繰り返し出現する単語を見つけるのが本記事のテーマです。この問題を実装する際には、Pythonの標準ライブラリである「collections」モジュールを活用します。collectionsが提供するCounter()クラスを使うことで、各単語の出現回数を簡単に集計できます。 アルゴリズム 処理の手順は以下のとおりです。 与えられた文字列をスペースで区切り、単語のリストに分割します。 単語のリストをCounter(辞書形式)に変換し、各単語の出現回数を集計します。 単語のリストを先頭から順に走査し、出現回数が1より多い最初の単語を特定します。 サンプルコード