题目描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
思路:
滑窗法:
- 使用哈希存放字符出现的次数
- 右端点开始向右遍历,若当前遍历的字符在窗口内已出现过,则将之前该相同的字符及之前的字符的次数减一,并将左端点移动到之前该相同字符的右侧,比如 abcbcbb,右端点遍历到第二个 b 时,之前已出现过 b,故将a与b出现的次数减一,并将左端点移动到c这里
- 以此类推
C++
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int len = s.size();
if (len < 1) return 0;
int left = 0, right = 0, res = 0;
vector<int>count(128, 0); //初始化vector为128个0
while (right < len)
{
char c = s[right++];
count[c]++;
while (count[c] > 1)
count[s[left++]]--;
res = max(res, right - left);
}
return res;
}
};