• 3.无重复字符的最长字串


    给定一个字符串,找出不含有重复字符的最长子串的长度。

    示例 1:

    输入: "abcabcbb"

    输出:

    解释: 无重复字符的最长子串是 "abc",其长度为 3。

    示例 2:

    输入: "bbbbb"

    输出: 1

    主要思想:“滑动窗口”,使用一个容器保存遍历的字符。

    遍历字符串,同时将不重复的字符保存到窗口中,窗口的右边界加一,相当于向右滑动了一位;当遇到重复字符时,就从窗口的左边界缩小窗口大小,直到容器中不包括该重复字符。本质上也是借助外部空间。

    解法1:

    int lengthOfLongestSubstring(string s)
    {
        int n = s.size();
        unordered_set<char> set;
        int max = 0, i = 0, j = 0;
        while (i < n && j < n)
        {
            auto f = set.find(s.at(j));
            if (f == set.end())
            {
                // 右边界向右滑动一位
                set.emplace(s.at(j++));
                max = std::max(max, j - i);
            }
            else
            {
                // 左边界向右缩小一位
                set.erase(s.at(i++));
            }
        }
        return max;
    }

    解法2:

    int lengthOfLongestSubstring(string s)
        {
            int n = s.size();
            unordered_map<char, int> mp;
            int max = 0;
    
            for (int j = 0, i = 0; j < n; ++j)
            {
                if (mp.count(s.at(j)) > 0)
                {
                    // 直接将窗口的左侧缩小成重复的字符的下一位
                    i = std::max(mp.at(s.at(j)), i);
                }
                max = std::max(max, j - i + 1);
                // 右边界向右滑动一位
                mp.emplace(s.at(j), j + 1);
            }
    
            return max;
        }
  • 相关阅读:
    auto关键字
    关闭vs的编译警告
    windows C++删除非空文件夹
    vs相同变量高亮显示
    梯度下降算法到logistic回归
    ubuntu 按键替换 Control_R to Left
    git 删除分之以及删除文件夹
    迄今为止计算机视觉领域超有实力的研究人物主页
    DeepLearning——CNN
    利用积分图进行均值滤波
  • 原文地址:https://www.cnblogs.com/jimobuwu/p/9755395.html
Copyright © 2020-2023  润新知