题目
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
- s.length <= 40000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof
解题思路
使用滑动窗口来解决
- 使用一个哈希表来存储字符出现的下标
- 初始化计算下标start = -1,长度length = 0
- 字符串转成字符数组,迭代字符数组
- 判断哈希表是否包含当前字符,包含时,从新计算开始下标start = Math.max(start, map.get(key)),取最大值是为了防止start往前移动,比如abba这种情况
- 更新当前字符的下标到哈希表
- 计算长度length = Math.max(length, i - start)
代码
复杂度
- 时间复杂度:O(n),循环一遍字符数组
- 空间复杂度:O(1),字符的 ASCII 码范围为0 ~ 127,哈希表最多存储O(128) = O(1)大小额外空间