3. 无重复字符的最长子串
-
本题直接强行遍历可以完成,但是时间复杂度较高,以下代码使用滑动窗口法完成;
-
滑动窗口右指针不需要回溯的原因分析:
- 右指针滑动到C时,因为RT+1元素已经出现,右指针停止滑动
- 此时窗口内的[LT,RT]元素没有重复
- 左指针右移一位,此时左右指针之间的元素仍无重复,右指针在原有位置上继续右移即可
-
unordered_set.count() 如果元素存在于容器中,则此函数返回1,否则返回0。
//直接模拟遍历是可以完成的,但是使用滑动窗口时间性能更优秀
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int result=0;
int n=s.size();
int lt,rt=-1;
unordered_set<char> set1;
for(lt=0;lt<n;lt++){//代表左指针
if(n-lt<result){break;} //剩余的长度比result还小,则不可能有更大的结果了,直接结束
if(lt!=0){set1.erase(s[lt-1]);}//代表左指针右移
//unordered_set.count() 如果元素存在于容器中,则此函数返回1,否则返回0。
while(rt+1<n&&set1.count(s[rt+1])==0){
set1.insert(s[rt+1]);
rt++;//如果rt下一个元素不超出界限并且和之前的元素没有重复,右指针右移
}
result=max(result,rt-lt+1);
}
return result;
}
};