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

 

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = ""
输出: 0

 

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

 

我的题解:

已知s由字母数字符号空格组成,所以我先想到根据ascii码构造一个小的哈希表,范围是0-127

1、思想是用哈希表记录s中每一个字符出现的位置,不断更新位置,根据位置变化维护子串长度;

2、设立移动窗口,start是窗口开始的位置,即上一次出现该字符的位置,如果出现了重复的字符,会更新窗口开始位置为上一次出现位置后一位;

3、在2过程中不断维护,当前位置-窗口开始位置即为当前子串长度,比较并维护当前子串长度和记录的最大字串长度。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int* last = new int[128];
        for (int i = 0; i < 128; i++) {
            last[i] = -1;
        }
        int n = s.length();

        int res = 0;
        int start = 0; 
        for (int i = 0; i < n; i++) {
            int index = s[i];
            start = max(start, last[index] + 1);
            res = max(res, i - start + 1);
            last[index] = i;
        }

        return res;

    }
};