事前にすべての部分文字列を生成し、それらをそれぞれのキーにマップできます。
#generates all substrings of s.
def genSubstrings(s):
#yield all substrings that contain the first character of the string
for i in range(1, len(s)+1):
yield s[:i]
#yield all substrings that don't contain the first character
if len(s) > 1:
for j in genSubstrings(s[1:]):
yield j
keys = ["New York", "Port Authority of New York", "New York City"]
substrings = {}
for key in keys:
for substring in genSubstrings(key):
if substring not in substrings:
substrings[substring] = []
substrings[substring].append(key)
次に、クエリを実行substrings
して、その部分文字列を含むキーを取得できます。
>>>substrings["New York"]
['New York', 'Port Authority of New York', 'New York City']
>>> substrings["of New York"]
['Port Authority of New York']
長所:
- 部分文字列によるキーの取得は、辞書にアクセスするのと同じくらい高速です。
短所:
- 生成
substrings
には、プログラムの開始時に 1 回限りのコストが発生し、 のキーの数に比例して時間がかかりますprograms
。
substrings
のキーの数にほぼ比例してprograms
増加し、スクリプトのメモリ使用量が増加します。
genSubstrings
キーのサイズに対して O(n^2) のパフォーマンスがあります。たとえば、「Port Authority of New York」は 351 個の部分文字列を生成します。