在包含Python中另一个字符串的所有字符的字符串中找到最小的窗口

假设我们有两个字符串s1和s2,我们必须在s1中找到最小的子字符串,这样才能有效地使用s2的所有字符。

因此,如果输入像s1 =“我是学生”,s2 =“ mdn”,则输出将是“ ma studen”

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

  • N:= 26

  • str_len:= main_str的大小,patt_len:=模式的大小

  • 如果str_len <patt_len,则

    • 不返回

  • hash_pat:=大小为N的数组,并用0填充

  • hash_str:=大小为N的数组,并用0填充

  • 对于范围在0到patt_len之间的我,执行

    • hash_pat [((pattern [i])的ASCII码]:= 1

  • 开始:= 0,start_index:= -1,min_len:= inf

  • 计数:= 0

  • 对于范围0到str_len的j,执行

    • 而hash_str [(main_str [start])的ASCII]> hash_pat [(main_str [start])的ASCII]或hash_pat [(main_str [start])的ASCII]与0相同,

    • len_window:= j-开始+ 1

    • 如果min_len> len_window,则

    • hash_str [(main_str [start])的ASCII]:= hash_str [(main_str [start])的ASCII]-1

    • 如果hash_str [(main_str [start])的ASCII]> hash_pat [(main_str [start])的ASCII],则

    • 开始:=开始+ 1

    • min_len:= len_window

    • start_index:=开始

    • 数:=数+ 1

    • hash_str [((main_str [j])的ASCII]:= hash_str [((main_str [j])的ASCII)] + 1

    • 如果hash_pat [(main_str [j])的ASCII不等于0,并且hash_str [(main_str [j])的ASCII] <= hash_pat [(main_str [j])的ASCII],则

    • 如果计数与patt_len相同,则

    • 如果start_index与-1相同,则

      • 不返回

    • 返回main_str的子字符串[从索引start_index到start_index + min_len]

    示例

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

    N = 256
    def get_pattern(main_str, pattern):
       str_len = len(main_str)
       patt_len = len(pattern)
       if str_len < patt_len:
          return None
       hash_pat = [0] * N
       hash_str = [0] * N
       for i in range(0, patt_len):
          hash_pat[ord(pattern[i])] += 1
       start, start_index, min_len = 0, -1, float('inf')
       count = 0
       for j in range(0, str_len):
          hash_str[ord(main_str[j])] += 1
    
          if (hash_pat[ord(main_str[j])] != 0 and hash_str[ord(main_str[j])] <= hash_pat[ord(main_str[j])]):
             count += 1
          if count == patt_len:
             while (hash_str[ord(main_str[start])] > hash_pat[ord(main_str[start])] or hash_pat[ord(main_str[start])] == 0):
          if (hash_str[ord(main_str[start])] > hash_pat[ord(main_str[start])]):
             hash_str[ord(main_str[start])] -= 1
             start += 1
          len_window = j - start + 1
          if min_len > len_window:
             min_len = len_window
             start_index = start
       if start_index == -1:
          return None
       return main_str[start_index : start_index + min_len]
    main_str = "I am a student"
    pattern = "mdn"
    print(get_pattern(main_str, pattern))

    输入值

    "I am a student", "mdn"

    输出结果

    m a studen
    猜你喜欢