输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
    思路:
    滑动窗口: 1. 定义start 下标和end 下标,
    2. end 向后移动,只要哈希表中有重复的数据,start 移动到 重复位置的后一个位置
    3. 当有重复的时候,记录每段长度,并比较

    1. class Solution {
    2. public:
    3. int lengthOfLongestSubstring(string s) {
    4. int start = 0;
    5. int end = 0;
    6. int length = 0;
    7. int res = 0;
    8. unordered_map<char, int> hash; //将下标存起来,键值为字符
    9. while(end < s.size()) {
    10. char curChar = s[end];
    11. if (hash.find(curChar) != hash.end() && hash[curChar] >= start) {
    12. // hash 中有存在的字符
    13. start = hash[curChar] + 1;
    14. length = end - start;
    15. }
    16. hash[curChar] = end;
    17. end++;
    18. length++; // 防止没有重复字符的情况。 因为这里加1了,所以if 中计算长度的时候,没有加1
    19. res = max(res, length);
    20. }
    21. return res;
    22. }
    23. };