这题我这一拿到手,其实第一印象是双重for循环,后来循着循着发现不对,第一个字符串重复部分其实好搞,那中间的字符串呢。观看了一些题解之后,觉着确实应该设立一个头结点,来保证开始计算的地方,只要重复,就更改初始地段。话不多说,上代码。
class Solution {
public:
int lengthOfLongestSubstring(std::string s) {
//如果为空,直接返回0就好
if (s.empty())
return 0;
//定义一个头结点,一个计算的最大值,一个到时候可以排除有无重复的mymap
int head = 0, max_num = 0;
std::unordered_map<char, int>mymap;
for (int end = 0; end < s.size(); end++)
{
//map.count(Key)返回值为1或者0,1返回存在,0返回不存在,返回的是布尔类型的值
if (mymap.count(s[end]))
{
//确保head要往前走,而不是向后倒
head = std::max(head,mymap[s[end]] + 1);
}
max_num = std::max(max_num, end - head + 1);
mymap[s[end]] = end;
}
return max_num;
}
};
通过这题,我了解了unordered_map,哈希,并且最最主要的是,对head和end的用法似乎更熟练了,未来可期,加油。
备注,这是官方比较经典的一个解答
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
unordered_set<char> lookup;
int maxStr = 0;
int left = 0;
for(int i = 0; i < s.size(); i++){
//此处用while做循环,用left++,其实本质上就是让head逐个前移,本质不如我原答中key直接找快些
while (lookup.find(s[i]) != lookup.end()){
lookup.erase(s[left]);
left ++;
}
maxStr = max(maxStr,i-left+1);
lookup.insert(s[i]);
}
return maxStr;
}
};
然后我以上解法来源于leetcode中一名为“大鹏”的解法,思路图为
来首诗:摘自李商隐 《无题》
八岁偷照镜,长眉已能画。
十岁去踏青,芙蓉作裙衩。
十二学弹筝,银甲不曾卸。
十四藏六亲,悬知犹未嫁。
十五泣春风,背面秋千下。