首先用了时间复杂度为O(n^2)的方法,耗时比较长,花了216ms(好忧伤,自己首先想到的方法总是很耗时间。。。。)
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> ivec;
for (int i = 0; i != s.size(); ++i)
{
string exist;
int count = 0;
for (int j = i; j != s.size(); ++j)
{
if (exist.find(s[j]) == string::npos)
{
++count;
exist.insert(exist.end(), s[j]);
}
else
{
break;
}
}
ivec.push_back(count);
}
int max = 0;
for(vector<int>::const_iterator ite = ivec.begin();ite != ivec.end(); ++ite)
{
if(max < *ite)
max = *ite;
}
return max;
}
};
然后看了下别人的解法,时间复杂度是O(N),耗时16ms;解法就是找两个标记位,begin,end,一旦end指向的字符已经在前面出现过,就应该将begin和end同时往后移动一位,比如fdabcabc,最开始begin=0,直到end加到5,发现a字符重复,那么下一循环begin应该为3,end为6
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = s.size();
bool exist[128] = { false };//ASCII字符一共128种
int begin = 0, end = 0;
int maxlen = 0;
while(end < length)
{
if (exist[s[end]])
{
maxlen = max(maxlen, end - begin);
while (s[begin] != s[end])
{
exist[s[begin]] = false;
++begin;
}
++begin;
++end;
}
else
{
exist[s[end]] = true;
++end;
}
}
maxlen = max(maxlen, end - begin);//这一步别忘了
return maxlen;
}
};