开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
二、思路分析
这一题用了滑动窗口的思想,我此前还没有怎么接触过,具体来说就是先创建一个哈希表,使哈希表内的值即为窗口内的值,无重复。
设置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;
}
};
提交排名
四、总结
这题花了我一个下午,但收获也有很多,继续加油!