题目:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int length = 0 ;
unordered_set<char> vec ;
int k = 0 ;
for (int i = 0 ; i < s.size() ; i++)
{
if (i != 0 )
{
vec.erase(s[i-1]) ;
}
while (k < s.size() && vec.count(s[k])== 0 )
{
vec.insert(s[k]) ;
k++ ;
}
length = length > vec.size() ? length : vec.size();
}
return length ;
}
};
分析:
- 该题有几个点需要注意,第一个就是最长无重复字符的最长子串。那么如何求子串,经过看解析答案,官方给出的答案是滑动窗口法,what?其实就是两个指针一前一后的操作,后面的滑的过程是判断是否存在重复的字符,而前面的滑动是为了遍历。因此哟一个大致的思路,需要一个for循环进行前面的遍历指针,再需要一个后面的指针去判断是否存在重复的字符。
- 问题来了如何判断是否存在重复的字符,最初想法是把遍历的值放入vector里面然后再find是否下个字符在这个vector里面,看了答案,瞬间觉得数据结构用的真的不是很熟练,原来有个数据结构是unordered_set,这个类有个函数是find与count,都可以判断是否出现和重复亚元素的方法,于此类似的是string,因为string::find功能类似。
- unordered::erase,与ector::erase不同的是,vector::erase通过输入迭代器进行删除,二unordered::erase则通过删除字符来删除