自己的思路:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length() == 0)
{
return 0;
}
int max = 1;
int left = 0;
std::unordered_map<char, int> temp;
temp.insert(pair<char, int>(s[0], 0));
for(int i = 1; i < s.length(); i++)
{
std::unordered_map<char, int>::iterator iter;
iter=temp.find(s[i]);
if(iter != std::end(temp))
{
if(i-left > max)
{
max = i-left;
}
if(iter->second+1 > left)
{
left = iter->second+1;
}
}
temp[s[i]] = i;
}
if(s.length()-left > max)
{
max = s.length()-left;
}
return max;
}
};
改进,由发现重复字符才计算最大长度变为累加计算最大长度:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.length() == 0)
{
return 0;
}
int max = 0;
int left = 0;
std::unordered_map<char, int> temp;
for(int i = 0; i < s.length(); i++)
{
std::unordered_map<char, int>::iterator iter;
iter=temp.find(s[i]);
if(iter != std::end(temp))
{
if(iter->second+1 > left)
{
left = iter->second+1;
}
}
if(i-left+1 > max)
{
max = i-left+1;
}
temp[s[i]] = i;
//temp.insert(pair<char, int>(s[i], i));
}
//if(s.length()-left > max)
//{
// max = s.length()-left;
//}
return max;
}
};
遇到的坑:
- map是以红黑树实现的,有序存储;unordered_map是以哈希表实现的,无序存储;
- map和unordered_map 插入元素,键值 key 相同时,用下标插入会覆盖 value 值,用 insert 插入键值对则不覆盖;
- 试图用迭代器删除map中的部分元素,当一个元素被删除后,迭代器就失效了;
- 典型的滑动窗口问题,i相当于右指针,left相当于左指针。