Program to Find Out the Smallest Substring Containing a Specific String in Python



Suppose we have two strings s and t. We have to find the smallest substring in s, where t is also a subsequence of the substring. If that type of substring does not exist, we will return a blank string, and if there are multiple smallest substrings, we will take the leftmost one.

So, if the input is like s = "abcbfbghfb", t = "fg", then the output will be fbg

To solve this, we will follow these steps −

  • N := size of S

  • dp := a new list of size N initialized with infinity

  • for i in range 0 to N − 1, do

    • if S[i] is same as T[0], then

      • dp[i] := 1

  • for j in range 1 to size of T − 1, do

    • last := a new map

    • dp2 := a new list of size N initialized with infinity

    • for i in range 0 to N, do

      • if S[i] is same as T[j], then

        • prev_i := return the value of T[j − 1] from last

        • if prev_i is not null, then

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

        • last[S[i]] := i

      • dp := dp2

  • m := minimum of dp

  • i := return the index containing m in dp

  • if m is infinity, then

    • return blank string

  • return S[from index i − dp[i] + 1 to i]

Let us see the following implementation to get better understanding −

Example

 Live Demo

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"))

Input

"abcbfbghfb","fg"

Output

fbg
Updated on: 2020-12-26T11:57:01+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements