Sliding Window Technique - Part 8
Another approach to use sliding window technique is the following:
1/ Still have right and left pointers
2/ First loop is controlled by the right one, meaning it runs thru all the way to the length of the string
3/ The second loop is controlled by the left pointer (left over)
In all it is still O(2n). The problem below keeps track of K distinct chars in the sliding window. Code is down below, cheers, ACC
Longest Substring with At Most K Distinct Characters - LeetCode
340. Longest Substring with At Most K Distinct Characters
Medium
Given a string s and an integer k, return the length of the longest substring of s that contains at most k distinct characters.
Example 1:
Input: s = "eceba", k = 2 Output: 3 Explanation: The substring is "ece" with length 3.
Example 2:
Input: s = "aa", k = 1 Output: 2 Explanation: The substring is "aa" with length 2.
Constraints:
1 <= s.length <= 5 * 1040 <= k <= 50
Accepted
317,919
Submissions
659,182
public int LengthOfLongestSubstringKDistinct(string s, int k)
{
if (k == 0) return 0;
Hashtable slidingWindow = new Hashtable();
int left = 0;
int right = 0;
int retVal = 0;
while (right < s.Length)
{
if (slidingWindow.Count < k || (slidingWindow.Count == k && slidingWindow.ContainsKey(s[right])))
{
if (!slidingWindow.ContainsKey(s[right])) slidingWindow.Add(s[right], 0);
slidingWindow[s[right]] = (int)slidingWindow[s[right]] + 1;
retVal = Math.Max(retVal, right - left + 1);
right++;
}
else
{
if (slidingWindow.ContainsKey(s[left]))
{
slidingWindow[s[left]] = (int)slidingWindow[s[left]] - 1;
if ((int)slidingWindow[s[left]] == 0) slidingWindow.Remove(s[left]);
left++;
}
}
}
while (left < s.Length)
{
if (slidingWindow.ContainsKey(s[left]))
{
slidingWindow[s[left]] = (int)slidingWindow[s[left]] - 1;
if ((int)slidingWindow[s[left]] == 0) slidingWindow.Remove(s[left]);
if (slidingWindow.Count <= k) retVal = Math.Max(retVal, s.Length - left);
}
left++;
}
return retVal;
}
Comments
Post a Comment