滑动窗口经典题 leetcode 3. 无重复字符的最长子串

题目

 

解题思路

题目要求找出给定字符串中不含有重复字符的最长子串的长度。这是一个典型的滑动窗口的题目,可以通过滑动窗口去解答。

滑动窗口

具体操作如下图示:
找到一个子串 s[left...right] 不含重复字符

 

为了寻找最长子串,右边界 right 右移,拓展子串长度

 

若此时的字符 s[right + 1] 跟子串 s[left...right] 相比较,s[right + 1] 跟子串中的每个字符都不同,则将字符 s[right + 1] 也纳入到子串中

 

若此时的字符 s[right + 1] 跟子串 s[left...right] 中的某个字符相同,则将左边界 left 右移,刨除 s[left...right] 中的那个重复的字符

 

刨除后,继续组成没有重复元素的子串

...

从 left 到 right 这个区间形成一个滑动窗口,窗口不停向前滑动,寻找不含重复字符的最长子串,记录子串的长度,并求最长的子串长度

Show me the Code

int lengthOfLongestSubstring(char * s){
    int res = 0;
    int len = strlen(s);
    /* 存储 ASCII 字符在子串中出现的次数 */
    int freq[256] = {0};  
    /* 定义滑动窗口为 s[l...r] */
    int l = 0, r = -1; 
    while (l < len) {
        /* freq 中不存在该字符,右边界右移,并将该字符出现的次数记录在 freq 中 */
        if (r < len - 1 && freq[s[r + 1]] == 0) {
            freq[s[++r]]++;
        /* 右边界无法拓展,左边界右移,刨除重复元素,并将此时左边界对应的字符出现的次数在 freq 的记录中减一 */
        } else {
            freq[s[l++]]--;
        }
        /* 当前子串的长度和已找到的最长子串的长度取最大值 */
        res = fmax(res, r - l + 1);
    }

    return res;
}

 

 更多精彩

请关注

 回复「算法」,即可获取经典高清无码算法与数据结构相关电子书籍~

  

posted @ 2021-02-13 11:07  公众号程序员小熊  阅读(165)  评论(0编辑  收藏  举报