SubString Searching Problem with Sliding Window Solutions¶
A sliding window is an abstract concept commonly used in array/string problems. A window is a range of elements in the array/string which usually defined by the start and end indices, i.e. [i, j)[i,j) (left-closed, right-open). A sliding window is a window “slides” its two boundaries to the certain direction. For example, if we slide [i, j)[i,j) to the right by 11 element, then it becomes [i+1, j+1)[i+1,j+1) (left-closed, right-open).
LeetCode 3. Longest Substring Without Repeating Characters¶
- Solution::
- class Solution(object):
- def lengthOfLongestSubstring(self, s):
s = list(s) helper = {} begin = 0 end = 0 count = 0 maxLen = 0 while end < len(s):
- if s[end] not in helper:
- helper[s[end]] = 1
- else:
- helper[s[end]] += 1 count += 1
end += 1 while count > 0:
- if helper[s[begin]] > 1:
- count -= 1
helper[s[begin]] -= 1 if helper[s[begin]] == 0:
del helper[s[begin]]begin += 1
maxLen = max(maxLen, end - begin)
return maxLen
- class Solution(object):
- def lengthOfLongestSubstring(self, s):
maxLen = 0 i = j = 0 visited = set() while i < len(s) and j < len(s):
- if s[j] not in visited:
- visited.add(s[j]) j += 1 maxLen = max(maxLen, len(visited))
- else:
- visited.discard(s[i]) i+= 1
return maxLen
# In fact, it could be optimized to require only n steps. Instead of using a set to tell if a character exists or not, we could define a mapping of the characters to its index. Then we can skip the characters immediately when we found a repeated character.
LeetCode 438. Find All Anagrams in a String¶
Sliding window, does it have something to do with KMP? i find some logic are the same.
Solution:
class Solution(object):
def findAnagrams(self, s, p):
# create a bucket table for p which contains number of occurrences.
helper = dict()
for char in p:
helper[char] = helper[char]+1 if char in helper else 1
# number of distinct char
count = len(helper)
begin = end = 0
res = []
while end < len(s):
if s[end] in helper:
helper[s[end]] -= 1
if helper[s[end]]==0:
count -= 1
end += 1
# count is 0 means we have reached a pos that [begin, end) has all the
# possible chars in p
# next step is to check whether the [begin, end) is a valid sub-string
while count == 0:
if s[begin] in helper:
helper[s[begin]] += 1
if helper[s[begin]] > 0:
count += 1
# when the len doesn't match means we have extra chars
# the number of extras will be captured by helper[s[begin]] += 1
if end - begin == len(p):
res.append(begin)
begin += 1 # we will need the prev begin char to fill the new end position
return res
LeetCode 76. Minimum Window Substring¶
- class Solution(object):
- def minWindow(self, s, t):
s = list(s) helper = {} for c in t:
helper[c] = helper.get(c, 0) + 1begin = 0 end = 0 head = 0 counter = len(helper) maxLen = float(‘inf’) res = ‘’ while end < len(s):
- if s[end] in helper:
helper[s[end]] -= 1 if helper[s[end]] == 0:
counter -= 1end+=1
- while counter == 0:
- if s[begin] in helper:
helper[s[begin]] += 1 if helper[s[begin]] > 0:
counter += 1- if end - begin < maxLen:
- maxLen = end - begin head = begin
begin += 1
- if maxLen == float(‘inf’):
- return ‘’
- else:
- return ‘’.join(s[head: head+maxLen])
LeetCode 340. Longest Substring with At Most K Distinct Characters¶
Solution:
class Solution(object):
def lengthOfLongestSubstringTwoDistinct(self, s, k):
s = list(s)
helper = {}
begin = 0
end = 0
maxLen = 0
count = 0
while end < len(s):
if s[end] not in helper:
count += 1
helper[s[end]] = 1
else:
helper[s[end]] += 1
end += 1
while count > k:
helper[s[begin]] -= 1
if helper[s[begin]] == 0:
count -= 1
del helper[s[begin]]
begin += 1
maxLen = max(maxLen, end-begin)
return maxLen
LeetCode 424. Longest Repeating Character Replacement¶
LeetCode 424. Longest Repeating Character Replacement¶
- Solution::
- class Solution(object):
- def characterReplacement(self, s, k):
“”” :type s: str :type k: int :rtype: int “”” helper = {} begin = 0 end = 0 frequency = 0 res = 0 # (length of substring - number of times of the maximum occurring character in the substring) <= k while end < len(s):
- if s[end] in helper:
- helper[s[end]] += 1
- else:
- helper[s[end]] = 1
frequency = max(frequency, helper[s[end]])
- if end - begin - frequency + 1> k:
- helper[s[begin]] -= 1 begin += 1
res = max(res, end-begin+1) end += 1
return res
LeetCode 30. Substring with Concatenation of All Words¶
TOO Complicated, give up for now.