• LeetCode 第 3 号问题:无重复字符的最长子串


    本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
    个人网站: https://www.cxyxiaowu.com

    题目来源于 LeetCode 上第 3 号问题:无重复字符的最长子串。题目难度为 Medium,目前通过率为 29.0% 。

    题目描述

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

    示例 1:

            输入: "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc"所以其长度为 3
          

    题目解析

    建立一个256位大小的整型数组 freg ,用来建立字符和其出现位置之间的映射。

    维护一个滑动窗口,窗口内的都是没有重复的字符,去尽可能的扩大窗口的大小,窗口不停的向右滑动。

    • (1)如果当前遍历到的字符从未出现过,那么直接扩大右边界;
    • (2)如果当前遍历到的字符出现过,则缩小窗口(左边索引向右移动),然后继续观察当前遍历到的字符;
    • (3)重复(1)(2),直到左边索引无法再移动;
    • (4)维护一个结果res,每次用出现过的窗口大小来更新结果 res,最后返回 res 获取结果。

    动画描述


    v2-1d671c551571210a6bb3a71abae85815_b.gif


    代码实现

            // 滑动窗口
    // 时间复杂度: O(len(s))
    // 空间复杂度: O(len(charset))
    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int freq[256] = {0};
            int l = 0, r = -1; //滑动窗口为s[l...r]
            int res = 0;
            // 整个循环从 l == 0; r == -1 这个空窗口开始
            // 到l == s.size(); r == s.size()-1 这个空窗口截止
            // 在每次循环里逐渐改变窗口, 维护freq, 并记录当前窗口中是否找到了一个新的最优值
            while(l < s.size()){
                if(r + 1 < s.size() && freq[s[r+1]] == 0){
                    r++;
                    freq[s[r]]++;
                }else {   //r已经到头 || freq[s[r+1]] == 1
                    freq[s[l]]--;
                    l++;
                }
                res = max(res, r-l+1);
            }
            return res;
        }
    };
    
          

    我的专栏:

    和程序员小吴一起学算法


    ❤️ 看完三件事:

    如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个忙:

    1. 点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-
    2. 关注我和专栏,让我们成为长期关系
    3. 关注公众号「五分钟学算法」,第一时间阅读最新的算法文章,公众号后台回复 1024 送你 50 本 算法编程书籍。

    v2-7d84a7f4361bd5f8d21b98b9edb0b1b4_b.jpg

  • 相关阅读:
    python面对对象编程------3:写集合类的三种方法
    python面对对象编程----2:__init__
    python面对对象编程----1:BlackJack(21点)
    wxpython下的桥梁信息管理系统
    python运行时间计算之timeit
    python单元测试之unittest
    python 下的数据结构与算法---8:哈希一下【dict与set的实现】
    python 下的数据结构与算法---7:查找
    python 下的数据结构与算法---6:6大排序算法
    分布式一致性算法Raft
  • 原文地址:https://www.cnblogs.com/csnd/p/16675406.html
Copyright © 2020-2023  润新知