• 3:无重复字符的最长子串(C++)


    题目地址:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

    题目描述

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

    题目示例

    示例 1:

    输入: s = "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    示例 2:

    输入: s = "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    示例 3:

    输入: s = "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    示例 4:

    输入: s = ""
    输出: 0

    解题思路

    思路:滑动窗口+双指针。使用双指针i和j分别表示无重复子串的左右边界,滑动窗口的右边界不断将新元素加入窗口,当窗口内的元素不含有重复元素市,满足要求,否则不满足要求。此时,需要将滑动窗口的左边界i右移,移至重复元素的下一位置,并重新开始移动窗口的右边界j,一直维持这样的滑动窗口,记录窗口的最大长度。

    程序源码

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            if(s.empty()) return 0;
            int len = 0;
            unordered_map<char, int> dic; //存储最长子串
            int i = 0, j = 0; //i,j分别为不重复字符最长子串左右边界[i,j]
            while(j < s.size())
            {
                if(dic.find(s[j]) != dic.end()) //用m.count(s[j])>0也可判断是否已经存在该元素
                {
                    i = max(i, dic[s[j]] + 1); //更新左边界为重复字符下一位置
                }
                dic[s[j]] = j;
                len = max(len, j - i + 1); 
                j++; //当前窗口无重复元素,右边界j一直右移
            }
            return len;
        }
    };
    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            unordered_set<char> visited;
            int len = 0;
            for (int left = 0, right = 0; right < s.size(); right++) {
                while (visited.count(s[right]) > 0) {
                    visited.erase(s[left]);
                    left++;
                }
                visited.insert(s[right]);
                len = max(len, right - left + 1);
            }
    
            return len;
        }
    };

    参考文章:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/solution/shuang-zhi-zhen-hua-dong-chuang-kou-dong-tai-gui-2/

    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    浅谈javascript中一些与DOM元素相关的属性名词
    一个弹出层插件
    模仿京东商城的一个图片轮播
    jQuery设计思想
    模仿自动完成效果
    linux下如何用GDB调试c++程序(转)
    Linux makefile 教程
    boost库解析
    记一次MongoDB性能问题,附原理解析
    深入分析Linux内核源码
  • 原文地址:https://www.cnblogs.com/wzw0625/p/14366506.html
Copyright © 2020-2023  润新知