สมมติว่าเรามีสตริง S เราต้องหาจำนวนสตริงย่อยที่มีความยาว K โดยที่ไม่มีอักขระซ้ำ ดังนั้นถ้า S =“heyfriendshowareyou” และ K คือ 5 ผลลัพธ์จะเป็น 15 เนื่องจากสตริงคือ [heyfr, eyfri, yfrie, frien, riend, iends, endsh, ndsho, dshow, showa, howar, oware, warey, areyo , คุณ]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- สร้างแผนที่ว่างหนึ่งแผนที่ m และซ้าย :=0 และขวา :=-1 และ ans :=0
- ในขณะที่ขวา <ความยาวของสตริง – 1
- ถ้าขวา – ซ้าย + 1 =k แล้ว
- เพิ่ม ans ขึ้น 1
- ลด m[str[left]] ลง 1
- เพิ่มขึ้นทางซ้าย 1
- ไปต่อตอนต่อไป
- ถ้า str[right + 1] ไม่อยู่ใน m แล้ว
- set m[str[right + 1]] :=1
- เพิ่มสิทธิ์ 1
- ถ้า m[str[right + 1]] เป็น 0 แล้ว
- เพิ่ม m[str[right + 1]] ขึ้น 1
- เพิ่มสิทธิ์ 1
- อย่างอื่น
- ลด m[str[left]] ลง 1
- ซ้าย :=ซ้าย + 1
- ถ้าขวา – ซ้าย + 1 =k แล้ว
- ถ้า ขวา – ซ้าย + 1 =k ให้เพิ่ม ans ขึ้น 1
- คืนสินค้า
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อทำความเข้าใจ −
class Solution(object): def numKLenSubstrNoRepeats(self, S, K): m = {} left = 0 right = -1 ans = 0 while right<len(S)-1: if right - left + 1 == K: ans+=1 m[S[left]]-=1 left+=1 continue if S[right+1] not in m : m[S[right+1]]=1 right+=1 elif not m[S[right+1]]: m[S[right+1]]+=1 right+=1 else: m[S[left]]-=1 left+=1 if right - left + 1 == K: ans+=1 return ans ob1 = Solution() print(ob1.numKLenSubstrNoRepeats("heyfriendshowareyou", 5))
อินพุต
"heyfriendshowareyou" 5
ผลลัพธ์
"AIIOC"