Given a string s, find the length of the longestsubstring without repeating characters.
Example 1:
Input: s = "abcabcbb"
Output: 3
Explanation: The answer is "abc", with the length of 3.
Example 2:
Input: s = "bbbbb"
Output: 1
Explanation: The answer is "b", with the length of 1.
Example 3:
Input: s = "pwwkew"
Output: 3
Explanation: The answer is "wke", with the length of 3.
Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.
Constraints:
0 <= s.length <= 5 * 104
s consists of English letters, digits, symbols and spaces.
Solutions
Solution 1: Two pointers + Hash Table
Define a hash table to record the characters in the current window. Let $i$ and $j$ represent the start and end positions of the non-repeating substring, respectively. The length of the longest non-repeating substring is recorded by ans.
For each character $s[j]$ in the string s, we call it $c$. If $c$ exists in the window $s[i..j-1]$, we move $i$ to the right until $s[i..j-1]$ does not contain c. Then we add c to the hash table. At this time, the window $s[i..j]$ does not contain repeated elements, and we update the maximum value of ans.
Finally, return ans.
The time complexity is $O(n)$, where $n$ represents the length of the string s.
Two pointers algorithm template:
for(inti=0,j=0;i<n;++i){while(j<i&&check(j,i)){++j;}// logic of specific problem}
proclengthOfLongestSubstring(s:string):int=vari=0j=0res=0literals:set[char]={}whilei<s.len:whiles[i]inliterals:ifs[j]inliterals:excl(literals,s[j])j+=1literals.incl(s[i])# Uniform Function Call Syntax f(x) = x.fres=max(res,i-j+1)i+=1result=res# result has the default return value