给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
中间隔了一段时间没有做LeetCode,加上我本身也没有什么基础,所以做起来十分费劲,基本上都是看着答案理解着写的。旨在记录我理解感悟的过程,以及用尽量通俗易懂的语言帮助和我一样没什么基础的人。
class Solution {
public:
int lengthOfLongestSubstring(std::string s)
{
if (s.size() == 0) return 0;
std::unordered_set<char> lookup;
int maxStr = 0;
int left = 0;
for (int right = 0; right < s.size(); right++)
{
while (lookup.find(s[right]) != lookup.end())
{
lookup.erase(s[left]);
left++;
}
maxStr = std::max(maxStr, right - left + 1);
lookup.insert(s[right]);
}
return maxStr;
}
};
unorder_set是c++11以后标准库中新增的4中哈希容器之一,需要#include<unordered_set>才可以使用。他主要有如下几个特性:
1.不再以键值对的形式存储数据,而是直接存储数据的值。
2.容器内部存储的各个元素的值都互不相等,且不能被修改。
3.不会对内部存储的数据进行排序。
前几行没什么好讲,主要是定义了一些必要的变量,由于我们是采用滑动窗口的思想,所以一定的会有left和right两个变量 ,还有一个存储最大字符串长度的变量。
外部的for循环遍历right,让right遍历每一个元素。
接下来的难点,最不容易理解的点:
while (lookup.find(s[right]) != lookup.end())
{
lookup.erase(s[left]);
left++;
}
find是unordered_set的一个方法,用于寻找某个特定元素。如果找到目标元素返回指向其的迭代器,如果没有找到则返回unordered_set末尾的迭代器。
代码的意思是,如果找到了,find就会返回那个元素的迭代器,自然不等于end(),所以会进入循环,将左指针代表的元素抹除,并将左指针向右移动一位。
判断完是否有重复元素之后,判断新的长度和原来的长度哪个更大,更新最大值,同时插入新的右值以供下一轮判断重复元素。