给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
代码如下:
class Solution {
public:int lengthOfLongestSubstring(string s) {if(s.size()==0){return 0;}unordered_set<char> lookup;//哈希表,用于存放字符串中所有不重复的字符int maxstr=0;//用于记录最大不重复子串的长度int left=0;//滑动窗口的左指针for(int i=0;i<s.size();i++){//end()函数是最后一个元素的下一个位置,所以end()对应的结果一定是元素不在无序集合内//用lookup.find(s[i])查询元素是否在集合内并与end()做一个比较,因为lookup.end()是不在集合内,所以!=说明在集合内,=就是不在集合内while(lookup.find(s[i])!=lookup.end()){lookup.erase(s[left]);//当元素在无序集合内存在时,说明元素重复了,移除左指针指向的元素left++;//左指针向后移}maxstr=max(maxstr,i-left+1);//每循环一次更新一次最大不重复子串的长度lookup.insert(s[i]);//当元素不在无序集合内时,向无序集合内添加该元素}return maxstr;//最终返回最大值}
};