3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/.
本题考察的知识点为滑动窗口,此处假设有一个字符串S = “abcabcaaa”,并且有i ,j 分别指向字符串头的位置,当然我们还需要一个存储字符的集合set。
//代码实现
public int lengthOfLongestSubstring(String s) {
//存储数据的集合
Set<Character> set = new HashSet<>();
int i = 0, j = 0, maxLength = 0;
while(i < s.length() && j < s.length()){
//如果没有包含,则我们需要将其加入集合中,然后继续判断下一个
if(!set.contains(s.charAt(j))){
set.add(s.charAt(j));
j ++;
}else{
//如果包含,则我们需要去除掉第一个元素,然后再判断是否仍然包含
set.remove(s.charAt(i));
i ++;
}
//最后的长度即为j - i 的长度(不+1的原因是因为判断完j不在以后,j++了一次)
maxLength = Math.max(maxLength, j - i);
}
return maxLength;
}
滑动窗口代码模板(以下内容出自公众号:labuladong, 作者:labuladong)
附上公众号上的一首诗
滑动窗口算法框架:
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
// c 是将移入窗口的字符
char c = s[right];
// 右移窗口
right++;
// 进行窗口内数据的一系列更新
...
/*** debug 输出的位置 ***/
printf("window: [%d, %d)\n", left, right);
/********************/
// 判断左侧窗口是否要收缩
while (window needs shrink) {
// d 是将移出窗口的字符
char d = s[left];
// 左移窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}
其中两处…表示的更新窗口数据的地方,到时候你直接往里面填就行了。