(C++)无重复字符的最长子串--滑动窗口

个人主页:Lei宝啊 

愿所有美好如期而遇


力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/wtcaE1/(C++)无重复字符的最长子串--滑动窗口_第1张图片

算法原理

滑动窗口其实就是种双指针,只是这种双指针只向后移动,不会回退,具有单调性,也就是说,整个过程中left和right只会++。

我们定义left和right为0,以及一个hash数组,将我们遍历过的字母全部填入,并且检测是否有超过1的,如果有,那么从left开始走的字母全部出hash表,直到超过1的那个字母不再超过1,我们看图解。

图示

(C++)无重复字符的最长子串--滑动窗口_第2张图片

(C++)无重复字符的最长子串--滑动窗口_第3张图片

(C++)无重复字符的最长子串--滑动窗口_第4张图片

(C++)无重复字符的最长子串--滑动窗口_第5张图片

(C++)无重复字符的最长子串--滑动窗口_第6张图片

(C++)无重复字符的最长子串--滑动窗口_第7张图片

(C++)无重复字符的最长子串--滑动窗口_第8张图片

以此类推,不再往下画。

代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) 
    {
        int hash[128] = {0};
        int len = 0;

        for(int right = 0, left = 0; right < s.size(); right++)
        {
            hash[s[right]]++;
            for(int i=0; i<128; i++)
            {
                if(hash[i] > 1)
                {                  
                    while(hash[i] != 1) 
                    {                                          
                        hash[s[left++]]--;
                    }
                }
            }
            len = max(len, right-left+1);
        }

        return len;  
    }
};

你可能感兴趣的:(算法,算法,滑动窗口)