题目描述
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示
- 0 <= s.length <= 5 *
- s 由英文字母、数字、符号和空格组成
题目分析
这道题可以使用滑动窗口解决。首先初始化区间指针,并建立一个哈希表,存储字符索引值加一,加一表示从字符索引后一个才开始不重复。窗口区间就是不重复子字符串的区间,我们不断更新窗口大小,当遇到与区间内字符相同的情况,将字符作为 key 获取其 value 更新窗口大小,确保窗口中不存在相同的字符。在遍历的同时更新最长不重复子字符串的长度,最后返回即可。
题解
执行用时: 4 ms
内存消耗: 41.8 MB
class Solution {
public int lengthOfLongestSubstring(String s) {
// 获取字符串长度
int length = s.length();
// 统计结果
int count = 0;
// 哈希表
HashMap<Character, Integer> map = new HashMap<>();
// 左右指针遍历字符串
for (int left = 0, right = 0; right < length; ++right) {
// 获取右指针指向的字符
char cur = s.charAt(right);
// 哈希表中存在当前字符
if (map.containsKey(cur)) {
// 更新左指针
left = Math.max(map.get(cur), left);
}
// 更新统计结果
count = Math.max(count, right - left + 1);
// 哈希表中不存在当前字符 将字符添加进哈希表
map.put(s.charAt(right), right + 1);
}
return count;
}
}
题目来源:力扣(LeetCode)