leetcode

3.无重复字符的最长子串

力扣链接

class Solution {
public:
    int lengthOfLongestSubstring(std::string s) {
    	std::unordered_set<char> uset;
        // 易于理解
    	int left = 0, right = 0, res = 0;
    	for (;left < s.size();left++){
    		if (left >= 1) uset.erase(s[left - 1]);// 删除s中s[left]前一位字符 从1开始
    		while(right < s.size() && !uset.count(s[right])){
    			uset.insert(s[right]);
    			right++;
    		}
    		res = std::max(res, right - left); // 不需要+1因为 abca 有效长度4-1
    	}
    	return res;
    }
};
class Solution {
public:
    int lengthOfLongestSubstring(std::string s) {
        // 目标容器要能 判断是否有重复字符
        std::unordered_set<char> uset;
        // 右指针初始成-1 在s的左侧 没开始移动
        int left = 0, right = -1, res = 0;
        for (; left < s.size(); left++){
            // 左指针向右移动一格 left++后 删除left-1的字符
            if (left > 0) uset.erase(s[left - 1]);
            // 用right+1因为 不断向右移动右指针 while停止时 right+1指向重复元素 截止right
            while (right + 1 < s.size() && !uset.count(s[right + 1])){
                uset.insert(s[right + 1]);
                right++;
            }
            res = std::max(res, right - left + 1);
        }
        return res; 
    }
};