题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
示例 2
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
s.length <= 40000
分析
看到这题,最优先想到的就是逐个遍历。我们需要一个数据结构P
,用来记录已经遍历过的单词,需要一个变量start_index
,记录单词开始不重复的位置,还需要一个变量max
,记录当前最大的不重复长度。从最左侧第一个单词开始遍历,每次遍历到一个单词,判断单词有没有在P
中找到,如果找不到,根据记录的start_index
和当前遍历的索引cur_index
,更新最大值max
;反之如果能找到,则需要把start_index
置为当前重复的那个字母在P
中的索引位置加一,然后继续上述过程。流程图如下:
很明显,在第一层看,时间度是n
,但是注意,在P
中查找重复字母的位置时,需要实现时间复杂度为1的算法。不然就会超时。于是这里我们很容易想到使用哈希表,每