给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
解析:
使用一个最长标记量进行无重复字符最长子串记录,然后使用滑动窗口,用两个标记点将子串包含起来,右标记点从左到右进行遍历,如果遍历的字符包含在左右标记中间的子串中,那么左标记点就向右移动直到子串中只存在一次右标记点刚才纳入的字符,并将子串长度和最长表计量进行比较,更新到最大值即可。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0)return 0; // 判空
unordered_set<char> lookup; // 非排序无重复容器初始化
int maxStr = 0; // 最大标记量
int left = 0; // 左标记位置
for(int i = 0; i< s.size(); i++){ // 对字符串进行遍历
while(lookup.find(s[i]) != lookup.end()){ // 如果容器内不存在当前判断字符并且不在最后一位,则进入循环,否则进行下一步
lookup.erase(s[left]); // 清除最左边数据
left ++; // 左标记点右移一位
}
maxStr = max(maxStr, i - left + 1); // 更新最大标记量
lookup.insert(s[i]); // 存入当前判断字符
}
return maxStr; // 返回最大标记量
}
};