//示例为"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右移。每次更新子串长度时,我们将当前的子串长度和之前的最大子串长度取最大值。