在Python中查找给定位置处所有可能子字符串的给定字符串的子字符串程序

在Python中查找给定位置处所有可能子字符串的给定字符串的子字符串程序

假设我们提供n个字符串; str1,str2,str3,…..,strn。 现在,假设substri是包含stri的所有子字符串的集合。 所有子字符串集的联合是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’。

为了解决这个问题,我们将遵循以下步骤:

  • 定义函数lng_i()。这将取suff,lng,i
    • d:包含(suff,lng)的新元组
    • lo:0
    • hi:0
    • 对于d中的每个元组(suf,lng),执行以下操作
      • 如果lng与null相似,则
      • lng:= 0
      • hi:= hi + suf的大小-lng
      • 如果hi-1与i相同,则
      • 返回suf
      • 否则,当hi-1> i时,然后
      • 对于从lng到suf大小的值列表中的索引p和项q,执行以下操作
        • 如果lo + p与i相同,则
        • 返回suf [从索引0到j + 1]
      • lo:= hi
    • 返回False
  • 定义函数hlp_ii()。这将取str1,str2
    • ub:str1大小,str2大小的最小值
    • cnt:0
    • 对于i从0到ub,执行以下操作
      • 如果str1[i]与str2[i]相同,则
      • cnt:cnt + 1
      • 否则,
      • 返回cnt
      • 返回cnt
  • t_dict:一个新映射
  • suff:一个新列表
  • lng:一个新列表
  • 对于字符串中的每个str,执行以下操作
    • 对于i从0到str的大小,执行以下操作
      • value:str [从索引i到结束]
      • 如果value不在t_dict中,则
      • t_dict [value]:= 1
      • 在suff末尾插入value
    • 对列表suff进行排序
    • suff_len:suff的大小
    • 对于i从0到suff_len的大小,执行以下操作
      • 如果i与0相同,则
      • 在lng末尾插入null
      • 否则,
      • 在lng末尾插入hlp_ii(suff [i-1],suff [i])
    • res:一个新列表
    • 对于q_list中的每个q,执行以下操作
      • 在res的末尾插入(lng_i(suff,lng,q-1))
    • 返回res

例子

让我们看以下实现,以更好地理解-

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']

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程