给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    示例 1:

    1. 输入: "abcabcbb"
    2. 输出: 3
    3. 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3

    示例 2:

    1. 输入: "bbbbb"
    2. 输出: 1
    3. 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1

    示例 3:

    1. 输入: "pwwkew"
    2. 输出: 3
    3. 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3
    4. 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

    解法1:双循环逐个遍历

    1. var lengthOfLongestSubstring = function (s) {
    2. var size = s.length;
    3. var max = 0;
    4. for (let i = 0; i < size; i++) {
    5. if (max + i >= size) break;
    6. var m = s[i];
    7. for (let j = i + 1; j < size; j++) {
    8. if (m.indexOf(s[j]) === -1) {
    9. m += s[j];
    10. }
    11. else {
    12. max = Math.max(max, m.length);
    13. break;
    14. }
    15. }
    16. max = Math.max(max, m.length);
    17. }
    18. return max;
    19. };

    解法2:维护数组

    1. var lengthOfLongestSubstring = function (s) {
    2. var result = [];
    3. var max = 0;
    4. for (let i = 0; i < s.length; i++) {
    5. const index = result.indexOf(s[i]);
    6. if (index !== -1) {
    7. result.splice(0, index + 1);
    8. }
    9. result.push(s[i]);
    10. max = Math.max(max, result.length);
    11. }
    12. return max;
    13. }

    解法3:维护不重复的map

    1. var lengthOfLongestSubstring = function (s) {
    2. var map = new Map();
    3. var max = 0;
    4. for (let i = 0, j = 0; i < s.length; i++) {
    5. //滑动指针到最后面
    6. if (map.has(s[i])) {
    7. j = Math.max(map.get(s[i]) + 1, j);
    8. }
    9. map.set(s[i], i);
    10. //j和i之间为最长无重复字符
    11. max = Math.max(max, i - j + 1);
    12. }
    13. return max;
    14. }