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 * 104
0 <= 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