두 개의 문자열 s와 t가 있다고 가정하고 t의 모든 문자를 포함하는 s에서 최소 부분 문자열의 크기를 찾아야 합니다. 그러한 하위 문자열이 존재하지 않으면 -1을 반환합니다.
따라서 입력이 s ="thegrumpywizardmakes" t ="wake"와 같으면 "wake"를 포함하는 가장 짧은 부분 문자열이 "wizardmake"(길이 10)이므로 출력은 10이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
counter :=b의 각 문자의 빈도
-
시작 :=0
-
min_subs :=정보
-
rem :=b의 고유 문자 수
-
범위 0에서 크기까지의 경우
-
현재 :=a[종료]
-
전류가 카운터에 있으면
-
카운터[현재] :=카운터[현재] - 1
-
counter[current]가 0과 같으면
-
렘 :=렘 - 1
-
-
-
rem이 0인 동안 do
-
prev_char :=a[시작]
-
prev_char가 카운터에 있으면
-
카운터[이전_문자] :=카운터[이전_문자] + 1
-
counter[prev_char]> 0이면
-
렘 :=렘 + 1
-
-
-
min_subs :=min_subs의 최소값 및 (end - start + 1)
-
시작 :=시작 + 1
-
-
-
min_subs가 inf가 아니면 min_subs를 반환하고 그렇지 않으면 -1
예제(파이썬)
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
class Solution:
def solve(self, a, b):
counter = {}
for char in b:
counter[char] = counter.get(char, 0) + 1
start = 0
min_subs = float("inf")
rem = len(counter)
for end in range(len(a)):
current = a[end]
if current in counter:
counter[current] -= 1
if counter[current] == 0:
rem -= 1
while rem == 0:
prev_char = a[start]
if prev_char in counter:
counter[prev_char] += 1
if counter[prev_char] > 0:
rem += 1
min_subs = min(min_subs, end - start + 1)
start += 1
return min_subs if min_subs != float("inf") else -1
ob = Solution()
s = "thegrumpywizardmakes"
t = "wake"
print(ob.solve(s, t)) 입력
"thegrumpywizardmakes", "wake"
출력
2