美文网首页
leetcode 刷题 题3. 无重复字符的最长子串

leetcode 刷题 题3. 无重复字符的最长子串

作者: dreamer11 | 来源:发表于2021-05-15 09:42 被阅读0次

    题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
    示例 :
    输入: 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;
        }
    

    相关文章

      网友评论

          本文标题:leetcode 刷题 题3. 无重复字符的最长子串

          本文链接:https://www.haomeiwen.com/subject/vvshjltx.html