给定一个字符串 s
,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"abc",所以其长度为 3。
看到这个第一意识想到模式匹配算法,但和这个没啥关系(KMP当时困扰了很久,印象很深刻)。这里可以考虑滑动窗口的想法,符合条件的纳入窗口,不符合条件的移出窗口,让窗口从左向右滑动。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;
unordered_set<char> umap;//只有KEY的哈希
int left=0,maxture=0;
for(int i=0;i<s.size();++i)
{
while(umap.find(s[i])!=umap.end())//返回的迭代器不是end,
//说明该元素已经存在,所以是重复元素,移出窗口
{
umap.erase(s[left]);
++left;
}
maxture=max(maxture,i-left+1);
umap.insert(s[i]);
}
return maxture;
}
};