Pythonで文字列内の単語に一致するインデックスペアを求める方法
テキスト文字列と単語のリストが与えられたとき、部分文字列 text[i]...text[j] が単語リストに含まれるようなすべてのインデックスペア [i, j] を見つける問題を考えてみましょう。例えば、文字列が「ababa」、単語の配列が ["aba", "ab"] の場合、出力は [[0,1], [0,2], [2,3], [2,4]] となります。
ここで注目すべき点は、マッチが重なり合う可能性があるということです。この例では「aba」が [0,2] と [2,4] の両方でマッチしています。
解決のためのアプローチ
この問題は、次の手順で解くことができます。
- 結果を格納するための空のリスト res を用意します
- i を 0 から文字列の長さまで順にループさせます
- j を i + 1 から文字列の長さ + 1 まで順にループさせます
- インデックス i から j までの部分文字列が words リストに含まれている場合、(i, j − 1) を結果リストに追加します
- j を i + 1 から文字列の長さ + 1 まで順にループさせます
- 最後に結果リストを返します
Pythonでの実装例
より理解を深めるために、以下の実装を見てみましょう。
class Solution(object):
def indexPairs(self, text, words):
result = []
for i in range(len(text)):
for j in range(i+1,len(text)+1):
if text[i:j] in words:
result.append([i,j-1])
return result
ob1 = Solution()
print(ob1.indexPairs("ababa",["aba","ab"]))
入力
"ababa" ["aba","ab"]
出力
[[0,1],[0,2],[2,3],[2,4]]
計算量に関する補足
この手法では、すべての開始位置 i と終了位置 j の組み合わせ(約 n² 通り)について部分文字列を生成し、words リストとの照合を行います。そのため、時間計算量は O(n²) オーダーになります。単語の数が非常に多い場合は、Trie(トライ木)構造を活用することで照合処理を効率化できるので、応用テクニックとして覚えておくと良いでしょう。
-
文字列の中から偶数の長さの単語を出力するPythonプログラム
本記事では、与えられた問題を解決するための考え方と実装方法について解説します。Pythonの基本的な文字列操作を組み合わせることで、初心者の方でも簡単に実装できる内容となっています。 問題文 文字列が与えられたとき、その中に含まれる単語のうち、文字数が偶数であるものをすべて画面に表示するプログラムを作成します。 例えば、「tutorial point」という文字列が入力された場合、「tutorial」は8文字(偶数)なので出力され、「point」は5文字(奇数)なので出力されません。 解決のアプローチ この問題は、以下の手順で解決できます。 split()関数を使って、入力文字列を空白区切り
-
Pythonで文字列を単語のリストに変換する方法
文字列を単語のリストに変換したい場合は、空白文字を基準に文字列を分割するだけで実現できます。最もシンプルな方法は、文字列クラスが標準で提供している split() メソッドを使うことです。このメソッドのデフォルトの区切り文字は空白であり、文字列に対して呼び出すと、空白文字の位置で自動的に分割してくれます。split()メソッドを使う方法引数を指定せずに split() を呼び出すだけで、連続する空白もまとめて処理され、単語ごとのリストが返されます。コード例>>> Please split this string.split() [Please, split, this, st