在python中所有可能的子串集合中找出给定位置给定字符串的子串的程序
假设我们提供了n个字符串;str1,str2,str3,.....,strn.现在,让我们假设substri是一个包含stri的所有子串的集合。所有substr集合的并集是substr_union。我们现在有q个查询,我们必须找到集合substr_union的第q个元素。集合substr_union按字典顺序排序,索引从1开始。
因此,如果输入类似于字符串列表是=['pqr','pqt'],查询是=[4,7,9],那么输出将是['pqt','qt','t']
第一个字符串的子串是subs_str_1={p,pq,pqr,q,qr,r},sub_str_2={p,pq,pqt,q,qt,t}。
这两个集合的并集或substr_union是{p,pq,pqr,pqt,q,qr,qt,r,t}。
所以索引4、7和9处的项目分别是'pqt'、qt'和't'。
示例
让我们看看以下实现以获得更好的理解-
def lng_i(suff, lng, i):
d = zip(suff,lng)
lo = hi = 0
for suf, lng in d:
if lng is None:
lng = 0
hi += len(suf) - lng
if hi - 1 == i:
return suf
elif hi - 1 > i:
for p, q in enumerate(list(range(lng, len(suf)))):
if lo + p == i:
return suf[:q+1]
lo = hi
return False
def hlp_ii(str1,str2):
ub = min(len(str1), len(str2))
cnt = 0
for i in range(ub):
if str1[i] == str2[i]:
cnt += 1
else:
return cnt
return cnt
def solve(strings,q_list):
t_dict = {}
suff = []
lng = []
for str in strings:
for i in range(len(str)):
value = str[i:]
if value not in t_dict:
t_dict[value] = 1
suff.append(value)
suff.sort()
suff_len = len(suff)
for i in range(suff_len):
if i == 0:
lng.append(None)
else:
lng.append(hlp_ii(suff[i-1], suff[i]))
res = []
for q in q_list:
(res.append(lng_i(suff, lng, q-1)))
return res
print(solve(['pqr', 'pqt'], [4, 7, 9]))输入
['pqr', 'pqt'], [4, 7, 9]输出结果
['pqt', 'qt', 't']