题目描述
给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
输入输出样例
Input: s = "abcabcbb"
Output: 3
因为无重复,所以最后的b需要被舍去。因此最长子串是"abc",所以其长度为3
题解
这道题目我们可以使用滑动窗口的做法,从而避免使用暴力解法所导致的$O(n^{2})$的空间复杂度。滑动窗口其实主要就是使用双指针中的左右指针的技法。
初始化left = right = 0
,把索引左闭右开的区间[left,right)
称为一个「窗口」。我们先不断增加right指针扩大窗口[left,right]
,对应的键值也会增加,直到键值大于1时。此时,我们停止增加right
,转而不断增加left
指针缩小窗口,从而找到真正的不重复的子串。具体代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class Solution { public: int lengthOfLongestSubstring(string s) { unordered_map<char,int> windows;
int left = 0,right = 0; int res = 0;
while (right < s.size()) { char c = s[right]; right++; windows[c]++; while (windows[c] > 1) { char d = s[left]; left++; windows[d]--; }
res = max(res,right-left); } return res; } };
|