LC 题目链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目思路:
// 使用 unordered_set 记录滑动窗口中出现过的字符;
// 使用left /rigth 分别指向 窗口的左边和右边,起始位置均为 第一个字符;
// while (right < s.size())循环执行如下判断;
// 判断 right 指向的字符在 set中是否存在,不存在 直接添加到set 中,同时 right++; 然后 再 比较 记录 set 的size 与 最长字串长度 变量的大小
// 存在,则将 left 指向的字符从set中删除,同时 left++; 再执行上面的判断;
最终返回最长字串长度 即可。
这里有2点提下:
1. 通常的思路是将 滑动窗口中的出现过的字串 作为 一个子串, s.substr(left, right-left) 即可得到该子串; subString.find(s[right]) 这种方式来确认当前的字符是否出现在子串中,这种方式对于较短的字符串是可以解析的;但是有的用例会超时,因为查找的效率太低,不停的产生子串,然后进行搜索; 利用 set 的元素唯一性则是一个很方便的思路,查找 和 删除都很方便;
2. 使用 unordered_set 来代替set, 这个是出于性能的考虑,因为我们并不需要set中的元素有序,只要唯一即可。