本文首发于公众号「五分钟学算法」,是图解 LeetCode 系列文章之一。java
我的网站:www.cxyxiaowu.comc++
题目来源于 LeetCode 上第 3 号问题:无重复字符的最长子串。题目难度为 Medium,目前经过率为 29.0% 。git
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。github
示例 1:算法
输入: "abcabcbb"
输出: 3
解释: 由于无重复字符的最长子串是 "abc",因此其长度为 3。
复制代码
创建一个256位大小的整型数组 freg ,用来创建字符和其出现位置之间的映射。数组
维护一个滑动窗口,窗口内的都是没有重复的字符,去尽量的扩大窗口的大小,窗口不停的向右滑动。动画
// 滑动窗口
// 时间复杂度: O(len(s))
// 空间复杂度: O(len(charset))
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int freq[256] = {0};
int l = 0, r = -1; //滑动窗口为s[l...r]
int res = 0;
// 整个循环从 l == 0; r == -1 这个空窗口开始
// 到l == s.size(); r == s.size()-1 这个空窗口截止
// 在每次循环里逐渐改变窗口, 维护freq, 并记录当前窗口中是否找到了一个新的最优值
while(l < s.size()){
if(r + 1 < s.size() && freq[s[r+1]] == 0){
r++;
freq[s[r]]++;
}else { //r已经到头 || freq[s[r+1]] == 1
freq[s[l]]--;
l++;
}
res = max(res, r-l+1);
}
return res;
}
};
复制代码