Pythonで文字列内の恐竜の数を数える方法
「animals」という文字列と「dinosaurs」という文字列があるとします。animals の各文字は異なる種類の動物を表し、dinosaurs の一意な文字はそれぞれ異なる恐竜を表しています。このとき、animals 文字列の中に含まれる恐竜の総数を求める必要があります。
例えば、入力が animals = "xyxzxyZ"、dinosaurs = "yZ" の場合、出力は 3 になります。これは、恐竜の種類として y と Z の2種類があり、動物の文字列には y が2つ、Z が1つ含まれているためです。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- 結果を格納する変数 res を 0 で初期化する
- dinosaurs を set(集合)に変換し、重複する文字を除去する
- dinosaurs の各文字 c について、animals 内での出現回数を res に加算する
- 最終的な res を返す
実装例
それでは、実際のコードを見てみましょう。
class Solution:
def solve(self, animals, dinosaurs):
res = 0
dinosaurs = set(dinosaurs)
for c in dinosaurs:
res += animals.count(c)
return res
ob = Solution()
animals = "xyxzxyZ"
dinosaurs = "yZ"
print(ob.solve(animals, dinosaurs))
入力
"xyxzxyZ", "yZ"
出力
3
コードの解説
このソリューションでは、まず set() 関数を使って dinosaurs 文字列を集合に変換することで、重複する文字を排除しています。これにより、同じ恐竜の文字を二重にカウントすることを防いでいます。その後、集合内の各恐竜の文字について str.count() メソッドで animals 内の出現回数を数え、合計値を求めています。
計算量について見てみると、animals の長さを n、dinosaurs の一意な文字数を m とすると、全体の時間計算量は O(n × m) になります。
より効率的な代替案:Counter を使う方法
collections.Counter を利用すると、animals の各文字の出現回数を一度だけ数えておき、そこから恐竜の文字を取り出すだけでよくなるため、処理をより効率化できます。
from collections import Counter
class Solution:
def solve(self, animals, dinosaurs):
counter = Counter(animals)
return sum(counter[c] for c in set(dinosaurs))
ob = Solution()
animals = "xyxzxyZ"
dinosaurs = "yZ"
print(ob.solve(animals, dinosaurs))
この方法でも同じ結果である 3 が出力されます。文字列が長くなる場合や、複数回クエリを行う場合には、Counter を使ったアプローチの方が有利です。
-
Pythonで整数が回文数(パリンドローム)かどうかを判定する方法
整数が与えられたとき、それが回文数(パリンドローム)であるかどうかを判定する方法を解説します。回文数とは、前から読んでも後ろから読んでも同じ並びになる数値のことです。例えば「454」は逆順にしても「454」となるため回文数です。一方、「-565」を逆順にすると「565-」となり、マイナス記号の位置が変わるため元の数と一致せず、回文数にはなりません。解法の考え方この問題は非常にシンプルに解けます。手順は以下の通りです。1. 数値をstr()で文字列に変換する2. Pythonのスライス記法[::-1]を使って文字列を反転させる3. 元の文字列と反転した文字列を比較し、一致すればTrue、一致しな
-
Pythonで階乗を計算する3つの方法|forループ・再帰・math.factorial()の使い方
階乗(factorial)の計算は、データ分析をはじめとする数学的な処理において、Pythonでよく求められる操作の一つです。階乗とは、正の整数 n に対して、1から n までのすべての整数を掛け合わせた値のことです(例:5! = 1 × 2 × 3 × 4 × 5 = 120)。この記事では、Pythonで階乗を求める3つの方法を、コード例と実行結果とともにわかりやすく解説します。方法1:forループを使うforループで1から目的の数値まで順番に処理し、各ステップで掛け算を繰り返していく方法です。以下のプログラムでは、ユーザーに数値の入力を促し、ループ処理の前にint()で入力値を整数に変換