2021年最后一天,考完了最后一科,今晚在宿舍跨完年就出发乘坐凌晨1.49的火车。
新的一年,实习 and 秋招必要拿下!!!
题目
给定一个字符串
s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
题解
滑动窗口,用 set
判断是否左边有重复元素
一直增大右窗口
若遇到重复,处理左窗口(删除左重复元素及以前的元素)
C++代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
//滑动窗口 --> set
//一直更新窗口的左边就可以了
unordered_set<char> res;
int maxx = 0, l = 0;
for(int i = 0; i < s.length(); i++) {
//如果存在,删除最左边窗口到重复元素
while(res.find(s[i]) != res.end()){
res.erase(s[l++]);
}
//添加当前元素并更新最大值
res.insert(s[i]);
maxx = max(maxx, i-l+1);
}
return maxx;
}
};
Java代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> res = new HashSet<Character>();
int maxx = 0, l = 0;
int n = s.length();
for(int i = 0; i < n; i++) {
while(res.contains(s.charAt(i))) {
res.remove(s.charAt(l++));
}
res.add(s.charAt(i));
maxx = Math.max(maxx, i-l+1);
}
return maxx;
}
}