给定一个字符串 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; } };