Pythonで最初の文字列の最小インデックスに存在する2番目の文字列の文字を検索する方法
2つの文字列 str と patt があるとします。この課題では、str の中で最も小さいインデックス(先頭に近い位置)に現れる patt 内の文字を特定します。もし patt のどの文字も str に存在しない場合は、-1 を返します。
たとえば、入力が str = "helloworld"、patt = "wor" の場合、出力は 'o' になります。これは 'w' がインデックス 5、'o' がインデックス 4、'r' がインデックス 7 に存在しており、その中で最も小さいインデックスを持つのが 'o' だからです。
アルゴリズムの手順
この問題は、次の手順で解くことができます。
- 外側のループで、変数 i を 0 から patt のサイズまで順に処理します。
- 内側のループで、変数 j を 0 から Str のサイズまで順に処理します。
- patt[i] が Str[j] と一致し、かつ j が現在の minimum_index より小さい場合は、minimum_index を j に更新し、内側のループを抜けます。
- すべてのループが終了した後、minimum_index が初期値 109 と異なる(=一致する文字が見つかった)場合は、Str[minimum_index] を返します。
- 一致する文字が見つからなかった場合は、-1 を返します。
ここで minimum_index の初期値を非常に大きい値 109 としているのは、「まだ一致する文字が見つかっていない」状態を表すためです。
実装例
理解を深めるために、以下の実装例を見てみましょう。
def get_min_index_char(Str, patt): minimum_index = 10**9 for i in range(len(patt)): for j in range(len(Str)): if (patt[i] == Str[j] and j < minimum_index): minimum_index = j break if (minimum_index != 10**9): return Str[minimum_index] else: return -1 Str = "helloworld" patt = "wor" print(get_min_index_char(Str, patt))
入力
"helloworld", "wor"
出力
o
計算量について
このアルゴリズムは、patt の各文字に対して Str 全体を走査するため、時間計算量は O(n × m) となります(n は Str の長さ、m は patt の長さ)。ただし、一致する文字が見つかった時点で内側のループを break しているため、実際の処理はこれよりも高速に終わるケースが多くあります。
より Pythonic な書き方
Python の組み込み関数を活用すると、同じ処理をより簡潔に記述できます。
def get_min_index_char(Str, patt):
candidates = [ch for ch in patt if ch in Str]
return min(candidates, key=Str.index) if candidates else -1
print(get_min_index_char("helloworld", "wor")) # 出力: o
このコードでは、まずリスト内包表記で Str に存在する patt の文字だけを抽出し、min() 関数の key 引数に Str.index を指定することで、Str 内での出現位置が最も小さい文字を取得しています。可読性が高く、実務でもおすすめの書き方です。
-
【Python入門】文字列の中から最初の繰り返しのない文字を見つける2つの方法
この記事では、文字列や文字のストリームの中から最初に現れる繰り返しのない文字(ユニークな文字)を見つける方法を解説します。この問題には複数のアプローチがあり、本稿では同じ文字列に対して2つの異なるプログラムを作成して比較してみます。方法1:関数と辞書を使う方法(O(n)アルゴリズム)まずは、辞書(dict)を使って各文字の出現回数をカウントし、出現順序も保持する効率的な関数ベースの方法です。def firstNonRepeatingChar(str1): char_order = [] counts = {} for c in str1: if c in
-
Pythonで文字列内の最初に繰り返される単語を見つける方法
文字列が1つ与えられ、その中で最初に繰り返し出現する単語を見つけるのが本記事のテーマです。この問題を実装する際には、Pythonの標準ライブラリである「collections」モジュールを活用します。collectionsが提供するCounter()クラスを使うことで、各単語の出現回数を簡単に集計できます。 アルゴリズム 処理の手順は以下のとおりです。 与えられた文字列をスペースで区切り、単語のリストに分割します。 単語のリストをCounter(辞書形式)に変換し、各単語の出現回数を集計します。 単語のリストを先頭から順に走査し、出現回数が1より多い最初の単語を特定します。 サンプルコード