我自己的解法思路很简单:使用一个vector容器存储每个不重复的字符串,并且依据它们的长度进行排序,比较关键的一点就是实现迭代器的“回滚”,比如"dvdf"字串中,在保留"dv"之后,如何使迭代器回滚到‘v'上。规律是迭代器减去每个存入的字符串长度减一,就是需要回滚的位置。
我的代码如下:
if (s.size() == 0)
{
return 0;
}
if (s.size() < 2)
{
return s.size();
}
std::string::iterator iter = s.begin();
std::vector<std::string> strList;
while (iter!=s.end())
{
std::string temp;
while (iter != s.end() && std::find(temp.begin(), temp.end(), *iter) == temp.end())
{
temp.push_back(*iter);
iter++;
}
strList.push_back(temp);
iter -= (temp.size() - 1);
}
std::sort(strList.begin(), strList.end(), [](std::string a, std::string b) {return a.size() < b.size(); });
return strList.back().size();
事实证明我这个解法也是“擦边”过关,我练习leetcode的本身是练习思维,而不是“奇淫技巧”所以我在大神们的解法里,挑了个“符合我原则”的高效率写法学习。代码如下:
int lengthOfLongestSubstring(string s)
{
unordered_map<char, int> hashmap;
int result = 0;
int tmp = 0;
int j = 0;
for(int i = 0; i < s.size(); i++)
{
if(hashmap.find(s[i]) != hashmap.end())
{
j = max(j, hashmap[s[i]] + 1);
}
hashmap[s[i]] = i;
result = max(result, i - j + 1);
}
return result;
}
大神的解法思路和我是一样的,但区别是他使用了unordered_map这个容器。使用字符串s中的元素做为键,下标作为值,如果容器中找到同样“键”的元素,那么作为起点的变量j,就移动到其后的一个位置。并且不需存储每一个字符串,通过每一个字符串遇上一个进行长度对比,来保留最大值;以"dvdf"为例:result = max(2,3);