对于这个题目,我想到了和two sum一样用map来做,可是做出来超过了时间限制,下面把代码贴上来:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char,int>res;
int i=0,max=0,n=0;
char *p,*q,*pb;
pb= p=q=&s[0];
while(p<(pb+s.size())&&q<(pb+s.size())){
if (!res.count(*q))
{
res.insert(pair<char,int>(*q,i++));
q++;
n= q-p;
}
else{
p++;
if(max>(pb+s.size()-p))
{
return max;
}
q=p;
res.clear();
i=0;
}
if (max<n) max =n;
}
return max;
}
};
然后想到直接用哈希表来做,以字符为键,以字符所在字符串的位置为值:
public:
int lengthOfLongestSubstring(string s) {
int pos[512];
int max=0,min=0;
for (int i =0;i<512;i++)
{
pos[i]= -1;
}
for (int i = 0;i<s.size();i++)
{
if (pos[s[i]] == -1)
{
pos[s[i]] = i;
}
else{
if (i-min>max)
{
max = i-min;
}
for (int j =0;j<512;j++)
{
if (pos[j]!=-1&&pos[j]<pos[s[i]])
{
pos[j] = -1;
}
}
min = pos[s[i]]+1;
pos[s[i]] = i;
}
}
if (s.size()-min>max)
{
max = s.size()-min;
}
return max;
}
};
重点是下面代码的理解:如果从min开始一直都是没有重复的字符,那么就不会进入else语句
if (s.size()-min>max)
{
max = s.size()-min;
}