สมมติว่าเรามีสองสตริง s และ t เราต้องหาขนาดของสตริงย่อยขั้นต่ำใน s ที่มีอักขระทั้งหมดของ t หากไม่มีสตริงย่อยดังกล่าว ให้คืนค่า -1
ดังนั้น หากอินพุตเป็น s ="thegrumpywizardmakes" t ="wake" เอาต์พุตจะเป็น 10 เนื่องจากสตริงย่อยที่สั้นที่สุดที่มี "wake" คือ "wizardmake" (ความยาว 10)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ตัวนับ :=ความถี่ของอักขระแต่ละตัวใน b
-
เริ่ม :=0
-
min_subs :=inf
-
rem :=จำนวนอักขระที่แตกต่างใน b
-
สำหรับการสิ้นสุดในช่วง 0 ถึงขนาด a ทำ
-
ปัจจุบัน :=a[จบ]
-
ถ้ากระแสอยู่ในเคาน์เตอร์แล้ว
-
ตัวนับ[กระแส] :=ตัวนับ[กระแส] - 1
-
ถ้าตัวนับ[กระแส]เท่ากับ 0 แล้ว
-
rem :=rem - 1
-
-
-
ในขณะที่ rem เหมือนกับ 0 ทำ
-
prev_char :=a[start]
-
ถ้า prev_char อยู่ในเคาน์เตอร์ แล้ว
-
ตัวนับ[prev_char] :=ตัวนับ[prev_char] + 1
-
ถ้าตัวนับ[prev_char]> 0 แล้ว
-
rem :=rem + 1
-
-
-
min_subs :=ขั้นต่ำของ min_subs และ (end - start + 1)
-
start :=start + 1
-
-
-
คืนค่า min_subs เมื่อ min_subs ไม่ได้ inf เป็นอย่างอื่น -1
ตัวอย่าง (Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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