package com.app.main.LeetCode.slidingwindow;
import java.util.HashSet;
import java.util.Set;
/**
*
* 3
*
* medium
*
* https://leetcode.com/problems/longest-substring-without-repeating-characters/
*
* 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.
*
*
* Created with IDEA
* author:Dingsheng Huang
* Date:2020/1/16
* Time:下午6:49
*/
public class LongestSubstringWithoutRepeatingCharacters {
// concise code , using a hash set , O(2n) = O(n)
// optimize : using a map cache every element with last idx , O(N)
public int lengthOfLongestSubstring(String s) {
int ans = 0;
// sliding window
Set<Character> window = new HashSet<>();
int l = 0;
int r = 0;
while (r < s.length()) {
if (!window.contains(s.charAt(r))) {
window.add(s.charAt(r));
r++;
ans = Math.max(ans, window.size());
} else {
window.remove(s.charAt(l));
l++;
}
}
return ans;
}
}