Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

파이썬에서 가능한 모든 부분 문자열 세트의 주어진 위치에서 주어진 문자열의 부분 문자열을 찾는 프로그램

<시간/>

n개의 문자열이 제공된다고 가정합니다. str1, str2, str3,.....,strn. 이제 substri가 stri의 모든 부분 문자열을 포함하는 집합이라고 가정해 보겠습니다. 모든 substr 집합의 합집합은 substr_union입니다. 이제 q개의 쿼리가 주어지고 set substr_union의 q번째 요소를 찾아야 합니다. set 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() 함수를 정의합니다. 이것은 충분할 것입니다, lng, i
    • d :=(suff, lng)를 포함하는 새 튜플
    • lo :=0
    • 안녕하세요 :=0
    • d의 각 튜플(suf, lng)에 대해 다음을 수행합니다.
      • lng가 null과 유사하면
        • 길이 :=0
      • hi :=hi + suf - lng의 크기
      • hi - 1이 i와 같으면
        • 반환
      • 그렇지 않으면 hi - 1> i, then
        • lng에서 suf 크기까지의 값 목록에서 인덱스 p와 항목 q에 대해
          • lo + p가 i와 같으면
            • return suf[인덱스 0에서 j+1까지]
      • 로 :=안녕하세요
    • 거짓을 반환
  • hlp_ii() 함수를 정의합니다. 이것은 str1,str2
      이 걸릴 것입니다.
    • ub :=str1 크기의 최소값, str2 크기
    • cnt :=0
    • 0에서 ub 사이의 i에 대해
      • str1[i]가 str2[i]와 같으면
        • cnt :=cnt + 1
      • 그렇지 않으면
        • 반환 cnt
      • 반환 cnt
  • t_dict :=새 지도
  • suff :=새 목록
  • lng :=새 목록
  • 문자열의 각 str에 대해 다음을 수행합니다.
    • 범위 0에서 str 크기까지의 i에 대해

      • 값 :=str[인덱스 i에서 끝까지]
      • t_dict에 값이 없으면
        • t_dict[값] :=1
        • suff 끝에 값 삽입
  • 목록 부분 정렬
  • suff_len :=suff의 크기
  • 0에서 suff_len 크기 사이의 i에 대해
    • i가 0과 같으면
      • lng 끝에 null 삽입
    • 그렇지 않으면
      • lng 끝에 hlp_ii(suff[i-1], suff[i]) 삽입
  • res :=새 목록
  • q_list의 각 q에 대해 다음을 수행합니다.
    • res 끝에 (lng_i(suff, lng, q-1)) 삽입
  • 반환 결과

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

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