滑动窗口经典题 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; }
更多精彩
请关注
回复「算法」,即可获取经典高清无码算法与数据结构相关电子书籍~
公众号:【程序员小熊】华为程序员,公众号主要分享:各大厂笔试/面试中的高频算法题、编程语言和后台开发相关资料等。