力扣原题

✨ 题目:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

✨ 样例:

示例 1:

输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

示例 2:

输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。

示例 3:

输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以 其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。

示例 4:

输入: s = “”
输出: 0

✨ 解题:

这个 题实际是一种滑动窗口的思想
image.png
找到出现重复字符的位置,然后把窗口的左边向右挪一位,计算当前子串长度是否大于记录的最大长度,如果大于就进行更新,否则就继续移动右边界,找到 下一次出现重复的位置即可。
那么如何判断字符是否重复就很关键:

  1. 用映射。将每个字符都映射成一个bool型,为true就代表出现过,false代表没出现过
  2. 用集合。去集合中找一下这个元素是否出现即可,这里不妨用Hash集合
  1. # 商业转载请联系作者获得授权,非商业转载请注明出处。
  2. # For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.
  3. # 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
  4. # 作者(Author):yxr
  5. # 链接(URL):http://1.117.163.52/index.php/2021/11/14/%e5%8a%9b%e6%89%a3%e6%89%93%e5%8d%a1%ef%bc%9a%e6%97%a0%e9%87%8d%e5%a4%8d%e5%ad%97%e7%ac%a6%e7%9a%84%e6%9c%80%e9%95%bf%e5%ad%90%e4%b8%b2/
  6. # 来源(Source):樱花庄的白猫
  7. class Solution {
  8. public:
  9. int lengthOfLongestSubstring(string s) {
  10. unordered_set<char> m_set;
  11. int n = s.size();
  12. int left = -1,ans = 0;
  13. for(int i = 0;i < n;i++){
  14. if(i != 0){
  15. m_set.erase(s[i-1]);
  16. }
  17. while(left + 1 < n && !m_set.count(s[left+1])){
  18. m_set.insert(s[left+1]);
  19. left++;
  20. }
  21. ans = max(ans,left-i+1);
  22. }
  23. return ans;
  24. }
  25. };