题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
分析
这道题目和昨天做的239滑动窗口最大值在解法上的思路有相同的地方,那道题使用的是deque来完成的,这道题目使用set和index来完成窗口的移动,效率会高一些。
有几个要点:
- 使用set来做去重,如果index当前位置的字符已经包含在set里面了,就说明需要移动窗口的起始位置了。
- 移动窗口之前我们先对当前的set内的字符数量做个统计,更新一下max的值
- 移动的方法:我们需要将window的起始节点移动到和当前字符重复的字符的后一个字符的位置上
比如
当index目前走到2的位置,和1位置上的w有冲突,起始位置由原来的0移动到2的位置。同理下面的h有冲突的话也还是移动到e的位置。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if (s.size() <= 1) return s.size();
//使用一个map来去除重复
set<char> se;
//定义一个最大值的变量
int max = 0;
int head = 0;
for(char c : s) {
if (se.count(c) > 0) {
//更新一下长度
if(max < se.size()) {
max = se.size();
}
while (c != s[head]) {
se.erase(s[head]);
head ++;
}
//c==s[head]的时候不剔除但是head要右移
head ++;
}else {
se.insert(c);
}
}
if(max < se.size()) {
max = se.size();
}
return max;
}
};