
一、暴力求解
(1)、 最开始想的就是:使用一个循环判断第一个字符的最长子串长度、第二个···-》最后一个,取最大的作为最长子串
int lengthOfLongestSubstring(string s)
{
int nTamp = 0;
for (int i = 0 ; i <s.length(); ++i)
{
map<char, int> temp;;
temp[s[i]] = i;
for (int j = i+1; j <s.length(); ++j)
{
if (temp.find(s[j]) == temp.end())
{
temp[s[j]] = i;
}
else
{
break;
}
}
if (nTamp < temp.size())
{
nTamp = temp.size();
}
}
return nTamp;
}

结果是超时:逻辑上看着没错,但是当string s足够长的时候,里程的for循环、和查找需要消耗的时间过多,所以此方案不可采取
(2)、在(1)的基础上我们会发现“abcabcbb”,当我们判断第一个a,发现出现第二个a的时候,我们此时的字符串应该变为“bcabcbb”,再去执行同样操作,能大大节省时间
int lengthOfLongestSubstring(string s)
{
int nTmep = 0;
vector<char> subs;
for (int i = 0 ; i <s.length(); ++i)
{
int nIndex = -1;
for (int j = 0 ; j < subs.size(); ++j)
{
if (subs[j] == s[i])
{
nIndex = j;
break;
}
}
subs.push_back(s[i]);
if (nIndex == -1)
{
if (nTmep < subs.size())
{
nTmep = subs.size();
}
}
else
{
// 清楚到Index的位置
subs.erase(subs.begin(), subs.begin() + nIndex + 1);
}
}
return nTmep;
}

运行时间还是过长
二、--
347

被折叠的 条评论
为什么被折叠?



