No.3《无重复字符的最长子串》;题型:滑动窗口(unordered_set),string
题目
题解思路(动态规划)
- 申请一个
unordered_set<char> lookup
,作为滑动窗口,用来存放临时子串; - 从第一个字符开始,对题目字符串进行一轮遍历,每轮循环中,依次将一个字符加入窗口并做以下判断::
(1)若在窗口子串中找到该字符,说明新的窗口子串不符合条件,则将窗口最左端元素移出,将新字符加入窗口中后,继续向下遍历;
(2)若窗口子串中没有该字符,将该字符加入窗口中,继续向下遍历,同时更新最长子串长度; - 全部遍历后,返回最长子串长度。
题解代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
unordered_set<char> lookup; //无序集合,用于存放临时子串
int ans = 0;
int left = 0;
for(int i = 0; i < s.size(); i++){ //滑动窗口,窗口右端每次向右移动一个字符
while (lookup.find(s[i]) != lookup.end()){ //若在子串中找到该字符
lookup.erase(s[left]); //此子串不符合条件,窗口最左端元素移出
left ++;
}
ans = max(ans,i-left+1); //存放最长有效子串的长度
lookup.insert(s[i]);
}
return ans;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/daily-temperatures
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。