3. 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例1
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例2
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
解法2参考官方题解:
解法1(滑动窗口,HashMap)
思路
- 定义一个map数据结构,其中key为字符,value值为字符位置+1。
- 不重复子串的开始位置为start,结束位置为end。
- 如果新遍历的字符与[start, end]区间字符有相同的情况,将字符作为key值,获取value值,更新start,然后将该key值的新value放入表中。
public int lengthOfLongestSubstring(String s) {
int n = s.length(), res = 0;
Map<Character, Integer> map = new HashMap<>();
for (int end = 0, start = 0; end < n; end++) {
char zf = s.charAt(end);
if (map.containsKey(zf)) {
// 遇到相同字符,获取该字符的value值,并更新start。
start = Math.max(map.get(zf), start);
}
// 每遍历一次就更新一次res
res = Math.max(res, end - start + 1);
// 放入相同字符的新的value值
map.put(s.charAt(end), end + 1);
}
return res;
}
解法2(滑动窗口,HashSet)
思路
- 定义一个HashSet数据结构,存储每一个字符。
- 不重复子串的开始位置为start,结束位置为end。
- 如果新遍历的字符与[start, end]区间字符有相同的情况,将字符作为key值,获取value值,更新start,然后将该key值的新value放入表中。
public int lengthOfLongestSubstring(String s) {
HashSet<Character> set = new HashSet<>();
int left = -1, right = right, res = 0;
for (int i = 0; i < right; i++) {
if (i != 0) {
// 从字符串开始删除字符,知道把重复字符删除
set.remove(s.charAt(i - 1));
}
while (left + 1 < right && !set.contains(s.charAt(left + 1))) {
// 添加非重复字符
set.add(s.charAt(left + 1));
++left;
}
// 更新res
res = Math.max(res, left - i + 1);
}
return res;
}