Problem could be found on Leetcode Here
Problem Description
Given a string, find the length of the longest substring without repeating characters.
Example 1:
Input: "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Note that the answer must be a substring, "pwke" is a subsequence and not a substring.
My Solution
Code
public class Solution {
public int LengthOfLongestSubstring(string s) {
HashSet<object> notdup = new HashSet<object>();
Queue anslist = new Queue();
int maxlen = 0;
for(int i = 0;i < s.Length;i++){
if(notdup.Contains(s[i])){
while(anslist.Count > 0 && notdup.Contains(s[i])){
var curele = anslist.Dequeue();
notdup.Remove(curele);
}
}
notdup.Add(s[i]);
anslist.Enqueue(s[i]);
int curlen = anslist.Count;
maxlen = curlen > maxlen ? curlen : maxlen;
}
return maxlen;
}
}
Explain
Time Complexity: O(n) - n is the length of string s
Key Points: Set, Queue
Maintain a Queue anslist
with unduplicated numbers, and a hashset notdup
to verify if the next char of string s inside the current queue in O(1) time. Time complexity for computer to find an element inside a list is O(m) - m is the current length of list, but only takes O(1) to find it in a set.
If the next char could be found in notdp
, record the current length of queue and pop the left-most element from the queue until the char that is the same with the next char canceled from notdp
Explain with Pictures
Then push elements to anslist
continuously until the next element is duplicated from the existed elements inside anslist
You find the next char ‘a’ is duplicated from ‘a’ in anslist
Record the current length of anslist
, compare it with the recorded maxlen
, if the current length is larger than maxlen
, replace maxlen
by current length, else do nothing with maxlen
Then pop the first element from anslist
until ‘a’ is not in anslist, delete the poped elements from notdp
at the same time, push the next element to anslist
and continue until reaches to the end of string