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

파이썬에서 특정 문자열을 포함하는 가장 작은 부분 문자열을 찾는 프로그램

<시간/>

두 개의 문자열 s와 t가 있다고 가정합니다. s에서 가장 작은 부분 문자열을 찾아야 합니다. 여기서 t는 부분 문자열의 부분 시퀀스이기도 합니다. 해당 유형의 하위 문자열이 존재하지 않는 경우 빈 문자열을 반환하고 가장 작은 하위 문자열이 여러 개 있는 경우 가장 왼쪽에 있는 문자열을 사용합니다.

따라서 입력이 s ="abcbfbghfb", t ="fg"와 같으면 출력은 fbg

가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • N :=S

    의 크기
  • dp :=무한대로 초기화된 크기 N의 새 목록

  • 범위 0에서 N − 1까지의 i에 대해 다음을 수행합니다.

    • S[i]가 T[0]과 같으면

      • dp[i] :=1

  • 범위 1에서 T − 1까지의 j에 대해 다음을 수행합니다.

    • 마지막 :=새 지도

    • dp2 :=무한대로 초기화된 크기 N의 새 목록

    • 범위 0에서 N까지의 i에 대해 수행

      • S[i]가 T[j]와 같으면

        • prev_i :=마지막에서 T[j − 1]의 값을 반환

        • prev_i가 null이 아니면

          • dp2[i] :=dp[prev_i] + (i − prev_i)

        • 마지막[S[i]] :=i

      • dp :=dp2

  • m :=dp의 최소값

  • i :=dp에 m을 포함하는 인덱스를 반환

  • m이 무한대이면

    • 빈 문자열 반환

  • 반환 S[인덱스 i − dp[i] + 1에서 i까지]

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

예시

class Solution:
   def solve(self, S, T):
      INF = float("inf")
      N = len(S)
      dp = [INF] * N
      for i in range(N):
         if S[i] == T[0]:
            dp[i] = 1
      for j in range(1, len(T)):
         last = {}
         dp2 = [INF] * N
         for i in range(N):
            if S[i] == T[j]:
               prev_i = last.get(T[j − 1], None)
               if prev_i is not None:
                  dp2[i] = dp[prev_i] + (i − prev_i)
            last[S[i]] = i
         dp = dp2
      m = min(dp)
      i = dp.index(m)
      if m == INF:
         return ""
      return S[i − dp[i] + 1 : i + 1]
ob = Solution()
print(ob.solve("abcbfbghfb","fg"))

입력

"abcbfbghfb","fg"

출력

fbg