不知道哪错了,求指一下

//示例为"abcabcbb",结果应为3,但是我是5
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        queue<char>q;
        int num=0;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]==q.front()){q.pop();}
        q.push(s[i]);
        int a=q.size();
        num=max(num,a);
    }
    return num;
    }
};

这段代码的问题在于当queue中不包含s[i]时,你仍然调用了 'q.frontq.front()来比较它和s[i]是否相等。当queue为空时,这个操作将导致运行时错误。另外,即使queue中已经包含s[i],你仍然需要将s[i]放入queue中以便计算当前的子串长度。因此,你需要修改代码来处理这些情况。

以下是你可以采用的一种解决方案:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_set<char> chars; // 存储当前子串中出现的字符
        int maxLength = 0;
        int i = 0, j = 0;
        while (i < s.size() && j < s.size()) {
            if (chars.find(s[j]) == chars.end()) {
                chars.insert(s[j++]);
                maxLength = max(maxLength, j - i);
            } else {
                chars.erase(s[i++]);
            }
        }
        return maxLength;
    }
};


在这个解决方案中,我们使用了一个unordered_set来存储当前子串中出现的字符。我们用i和j来表示子串的左右边界。当s[j]没有出现在子串中时,我们将其插入unordered_set中,并将j右移。如果s[j]已经出现在子串中,我们将s[i]从unordered_set中删除,并将i右移。每次更新子串长度时,我们将当前的子串长度和之前的最大子串长度取最大值。