Pythonで一貫性のある文字列の個数をカウントするプログラム
この記事では、Pythonを使って「一貫性のある(consistent)文字列」の個数を数えるアルゴリズムを解説します。
問題の定義
すべて異なる文字で構成された文字列 s と、複数の文字列を含む配列 words が与えられます。words 内の文字列が「一貫性がある」とみなされるのは、その文字列に含まれるすべての文字が s の中にも現れる場合です。このとき、words の中に一貫性のある文字列がいくつ存在するかを求めます。
入力例
s = "px" words = ["ad", "xp", "pppx", "xpp", "apxpa"]
この場合の出力は 3 になります。「p」と「x」だけで構成されている文字列は ["xp", "pppx", "xpp"] の3つだからです。「ad」には「a」「d」、「apxpa」には「a」が含まれているため、これらは条件を満たしません。
解き方のアプローチ
以下の手順で問題を解くことができます。
カウンター
countを 0 で初期化する。wordsの各単語words[i]について、その単語を構成する各文字words[i][j]を順番に調べる。もし
sに含まれていない文字が1つでも見つかったら、その単語は不適格なので内側のループを抜ける。すべての文字が
sに含まれていた場合のみ、countを 1 増やす。最後に
countを返す。
Pythonでの実装例
理解を深めるために、実際のコードを見てみましょう。
def solve(s, words):
count = 0
for i in range(len(words)):
for j in range(len(words[i])):
if words[i][j] not in s:
break
else:
# breakされずにループが完了した = 全文字がsに含まれる
count += 1
return count
s = "px"
words = ["ad", "xp", "pppx", "xpp", "apxpa"]
print(solve(s, words))
ポイント:Pythonの for-else 構文
このコードの鍵となるのが、Python特有の for-else 構文です。else ブロックは、break によってループが中断されずに最後まで実行された場合にのみ評価されます。これにより、「1文字も欠けていなかった場合だけカウントする」というロジックを簡潔に書けます。
実行結果
入力
"px", ["ad", "xp", "pppx", "xpp", "apxpa"]
出力
3
計算量について
このアルゴリズムの時間計算量は O(N × M) です。ここで N は words の単語数、M は各単語の平均的な長さを表します。さらに、s をあらかじめセット(set(s))に変換しておけば、文字の存在確認が O(1) になり、全体の処理をより高速化できます。
-
セットを使って文字列内の母音の数をカウントするPythonプログラム
本記事では、Pythonを使って文字列内に含まれる母音の数をカウントする方法について解説します。セット(set)を活用した効率的な実装を中心に、初心者の方にもわかりやすく説明していきます。 問題の概要 問題文:任意の文字列が与えられたとき、その文字列に含まれる母音の数をセットを使って数えます。 基本的なアプローチとしては、文字列全体を先頭から順に走査し、各文字が母音であるかどうかを判定します。母音であればカウントを1ずつ増やしていき、最終的な合計を出力します。 実装例 def vowel_count(str_): count = 0 # 母音をセットとして定義 vowe
-
連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム
この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を