Leetcode 3 Longest Substring Without Repeating Characters
题意
给定一个字符串,求出最长的无重复字符的子串
题目链接
https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
题解
可以用滑动窗口来解决问题,因为在这道题中窗口的左端点不会向左回退
滑动窗口模板
int l = 0;
int r = 0;
while( r < 滑动窗口的右端点) {
更新窗口元素(一般跟r有关);
r++;
while( 窗口中的元素不满足条件){
更新窗口(一般跟l有关);
l++;
}
}
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int l = 0;
int r = 0;
unordered_map<char, int> mp;
int ret = 0;
while(r < s.size()) {
mp[s[r]]++;
r++;
while( mp[s[r-1]] > 1) {
mp[s[l]]--;
l++;
}
ret = max(ret, r - l);
}
return ret;
}
};
这里需要注意的是由于r++在前面,而我们判断的时候是当前的窗口的最后一个字符是否出现了不止一次,当前的数组下标是r-1
, 而且计算长度的时候正常是r-l+1
,但由于少了r先++了,计算的时候应该用r-l
事件复杂度:
O
(
n
)
O(n)
O(n) n为字符串的长度
空间复杂度:
O
(
n
)
O(n)
O(n) 需要存储一个map,字符和个数的hashmap