LeetCode 3.无重复字符的最长子串(c++)

77 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

3.无重复字符的最长子串

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

二、思路分析

这一题用了滑动窗口的思想,我此前还没有怎么接触过,具体来说就是先创建一个哈希表,使哈希表内的值即为窗口内的值,无重复。

设置left和right两个值,用right遍历整个字符串,每一次都检测哈希表中是否有该字符,如果有的话,删除s[left],并将left向前移动一位,再次检测,直到哈希表中检测不到该字符。计算此时子串的长度,然后再把s[i]插入哈希表中。

这是很巧妙的一点,我自己想了很久。

三、AC代码

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() == 0) return 0;
        unordered_set<char> pair;
        int maxStr = 0;
        int left = 0;
        for(int i = 0; i < s.size(); i++){
            while (pair.count(s[i]) >=1){
                pair.erase(s[left]);
                left ++;
            }
            maxStr = max(maxStr,i-left+1);
            pair.insert(s[i]);
    }
        return maxStr;  
    }
};

提交排名

image.png

四、总结

这题花了我一个下午,但收获也有很多,继续加油!