看了下题目标签,有双指针和滑动窗口,然后就想从第一个字符开始,建立数组记录其出现次数,记录下最大窗口值。因为真的太菜了,然后写了很长很长。主要不会用哈希表 。
这是一个极度悲伤的事故,第一次因为边界问题,答案错误,然后改好了在VC运行是正常的,在LeetCode上执行也是正常的,但是最后提交的时候编译错误。。。。。
Line 11: Char 13: runtime error: index -65 out of bounds for type ‘int [26]’ (solution.cpp)然后我不会改。。
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left=0;
int right=0;
int maxl=0;
int ans=0;
int P[26]={0};
while(left<=right&&right<s.size())
{
P[s[right]-'a']++;
if(right>1&&s[right]==s[right-1])
{
maxl=right-left;
left=right;
memset(P,0,26);
P[s[left]-'a']++;
}
else if(P[s[right]-'a']>1)
{
P[s[left]-'a']--;
maxl=right-left;
left++;
}
else
{
maxl=right-left+1;
}
right++;
ans=max(ans,maxl);
}
return ans;
}
};
所以看了官方题解,有了新的AC代码
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int ans=0;
int right=0;
unordered_set<char> c;//建立哈希集合
if(s.size()==0)
return 0;
for(int left=0;left<s.size();left++)
{
while(right<s.size()&&!c.count(s[right]))//如果该字符未出现过则右指针右移
{
c.insert(s[right]);
right++;
}
ans=max(ans,(right-left));
if(right==s.size())
break;
c.erase(s[left]);//消除左指针指向的字符后左指针右移
}
return ans;
}
};