# 003.LongestSubstringWithoutRepeatingCharacters
































































// https://leetcode.com/problems/longest-substring-without-repeating-characters/

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring1 = function (s) {
    var len = s.length;
    if (len < 2) {
        return len;
    }
    var start = 0;
    var ans = 0;
    for (var i = 1; i < len; i++) {
        var item = s[i];
        var index = s.lastIndexOf(item, i - 1);
        if (index > -1) {
            ans = Math.max(ans, i - start);
            start = Math.max(start, index + 1);
        }
    }
    ans = Math.max(ans, len - start);
    return ans;
};

// two pointers
var lengthOfLongestSubstring2 = function (s) {
    if (s.length < 2) {
        return s.length
    }
    let max = 0;
    let cache = new Array(26).fill(0);
    for (let i = 0, j = 0; i < s.length; i++) {
        j = (cache[s.charAt(i)] > 0) ? Math.max(j, cache[s.charAt(i)]) : j
        // store the position next to this duplicate item
        // so j will be the pointer from the start of new subarray
        cache[s.charAt(i)] = i + 1
        max = Math.max(max, i - j + 1)
    }
    return max
};

// sliding window
var lengthOfLongestSubstring3 = function (s) {
    if (s.length < 2) {
        return s.length
    }
    let max = 0;
    let cache = new Map()
    let i = 0
    let j = 0
    while (i < s.length && j < s.length) {
        if (!cache.has(s.charAt(j))) {
            cache.set(s.charAt(j), true)
            j++
            max = Math.max(max, j - i)
        } else {
            cache.delete(s.charAt(i))
            i++
        }
    }
    return max
};