题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 :
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 是哪个子串不重要。
思路:滑动窗口思想
遍历s,并判断s[i]在容器lookup中是否有重复元素,若有的话,使用while循坏,清除掉lookup中s[i]前面的元素(s[i]不清除)。若没有重复,则将s[i]插入lookup容器中,并使用函数max(当前长度,此前最长的长度)求最大的长度。
补充知识:
set/multiset容器(unordered_set容器)
简介:所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构用二叉树实现。
set和multiset区别:set不允许容器中有重复的元素,但是multiset允许容器中有重复的元素
unordered_set容器插入时不会自动排序,且不允许有重复元素。
int lengthOfLongestSubstring(string s) {
int left = 0;
int maxStr = 0;
unordered_set<char> lookup; //创建一个容器,与set的区别是没有排好序的。
if(s.size() == 0) //若字符s为空,则返回0。
return 0;
for(int i=0; i<s.length(); i++)
{
while(lookup.find(s[i]) != lookup.end()) //当找到了相同的元素,就执行while循环。即清除掉lookup中s[i]前面的元素。
{
lookup.erase(s[left]);
left++;
}
maxStr = max(maxStr, i-left+1); //可以理解为比较记录的最大值maxStr,与当前在滑动窗口中的字符个数,取他们中的最大值。
lookup.insert(s[i]);
}
return maxStr;
}
网友评论