Giả sử chúng ta có một chuỗi S, chúng ta phải tìm số chuỗi con có độ dài K mà không có ký tự nào được lặp lại. Vì vậy, nếu S =“heyfriendshowareyou” và K là 5, thì đầu ra sẽ là 15, vì các chuỗi là [heyfr, eyfri, yfrie, frien, riend, iends, endh, ndsho, dshow, showa, howar, oware, warey, areyo , reyou]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- tạo một bản đồ trống m và left:=0 and right:=-1 and ans:=0
- while right <độ dài của chuỗi - 1
- nếu phải - trái + 1 =k, thì
- tăng ans lên 1
- giảm m [str [left]] đi 1
- tăng bên trái 1
- tiếp tục đến lần lặp tiếp theo
- nếu str [right + 1] không ở trong m, thì
- đặt m [str [right + 1]]:=1
- tăng ngay 1
- else nếu m [str [right + 1]] là 0 thì
- tăng m [str [right + 1]] lên 1
- tăng ngay 1
- khác
- giảm m [str [left]] đi 1
- left:=left + 1
- nếu phải - trái + 1 =k, thì
- nếu phải - trái + 1 =k, thì tăng a thêm 1
- trả lại ans
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
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))
Đầu vào
"heyfriendshowareyou" 5
Đầu ra
"AIIOC"