สมมติว่าเรามีตัวเลข k และสตริง s เราต้องการหาขนาดของสตริงย่อย (substring) ที่ยาวที่สุดซึ่งมีตัวอักษรที่แตกต่างกันไม่เกิน k ตัว
เช่น ถ้าข้อมูลนำเข้าคือ k = 3 s = "kolkata" ผลลัพธ์จะเป็น 4 เนื่องจากมีสตริงย่อยที่ยาวที่สุด 2 ตัวที่มีตัวอักษรแตกต่างกัน 3 ตัว คือ "kolk" และ "kata" ซึ่งมีความยาว 4
ขั้นตอนการแก้ปัญหา
- กำหนด
ans = 0,left = 0 - สร้างตารางแฮช
tableว่าง - วนลูป
rightตั้งแต่ 0 ถึงขนาดของs- 1:- อัปเดตจำนวนของ
s[right]ในtable - ถ้าขนาดของ
table <= kให้ans := max(ans, right - left + 1) - มิฉะนั้น (ขนาด > k):
- วนลูป while ขนาดของ
table > k:left_char := s[left]- ถ้า
table[left_char] == 1ให้ลบleft_charออกจากtable - มิฉะนั้น ให้ลดค่า
table[left_char]ลง 1 left := left + 1
- วนลูป while ขนาดของ
- อัปเดตจำนวนของ
- คืนค่า
ans
ตัวอย่างโค้ด
class Solution:
def solve(self, k, s):
ans = 0
left = 0
table = {}
for right in range(0, len(s)):
table[s[right]] = table.get(s[right], 0) + 1
if len(table) <= k:
ans = max(ans, right - left + 1)
else:
while len(table) > k:
left_char = s[left]
if table[left_char] == 1:
table.pop(left_char)
else:
table[left_char] -= 1
left += 1
return ans
ob = Solution()
k = 3
s = "kolkata"
print(ob.solve(k, s))
ข้อมูลนำเข้า
"anewcoffeepot"
ผลลัพธ์
4