• leetcode3. 无重复字符的最长子串 [滑动窗口]


    题目

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    思路

    设置两个指针left、right。固定left,向右移动right。设置set集合存储滑动窗口中的字符元素。

    情况①,当s[right] 没有在set集合中找到时,就将它插入到set集合;

    情况②,若在set集合中找到,则删除left指针指向的元素,直到set中没有与 s[right]相同的元素。

    代码

    1. class Solution {
    2. public:
    3. int lengthOfLongestSubstring(string s) {
    4. // 10.17 19:00
    5. set<char> st;
    6. int len = s.size();
    7. int left = 0, right = 0;
    8. int res = 0; // 最长子串长度
    9. while (left < len) {
    10. if (st.find(s[right]) == st.end()) {
    11. st.insert(s[right]);
    12. if(right < len)
    13. right++;
    14. }
    15. else { // 当前遍历元素 与 滑动窗口中的元素 有相同的元素时
    16. // 注意:不一定相同的元素就是第一个元素,是往后挪left指针,直到里面没有相同的元素时。
    17. char c = s[right];
    18. int length = right - left;
    19. if (length > res) res = length;
    20. while (st.find(s[right]) != st.end()) {
    21. st.erase(s[left++]);
    22. }
    23. // left++;
    24. }
    25. }
    26. return res;
    27. }
    28. };

    运行结果

  • 相关阅读:
    log4cpp初入门
    OpenCV图像处理方法:腐蚀操作
    C语言数组
    互联网摸鱼日报(2024-06-26)
    Matlab 将计算结果制作成 gif 动画
    爱上开源之DockerUI-如何实现Web端的Xshell终端模拟器
    【Linux操作系统】 虚拟文件系统 | 文件缓存
    扩容后宝塔不更新硬盘容量
    从0到1搭建redis6.0.7
    使用python把普通图片生成ico图标
  • 原文地址:https://blog.csdn.net/gsj9086/article/details/133891955