力扣原题
✨ 题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
✨ 样例:
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以 其长度为 3。
请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
示例 4:
✨ 解题:
这个 题实际是一种滑动窗口的思想
找到出现重复字符的位置,然后把窗口的左边向右挪一位,计算当前子串长度是否大于记录的最大长度,如果大于就进行更新,否则就继续移动右边界,找到 下一次出现重复的位置即可。
那么如何判断字符是否重复就很关键:
- 用映射。将每个字符都映射成一个bool型,为true就代表出现过,false代表没出现过
- 用集合。去集合中找一下这个元素是否出现即可,这里不妨用Hash集合
# 商业转载请联系作者获得授权,非商业转载请注明出处。
# For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.
# 协议(License):署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
# 作者(Author):yxr
# 链接(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/
# 来源(Source):樱花庄的白猫
class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_set<char> m_set;
int n = s.size();
int left = -1,ans = 0;
for(int i = 0;i < n;i++){
if(i != 0){
m_set.erase(s[i-1]);
}
while(left + 1 < n && !m_set.count(s[left+1])){
m_set.insert(s[left+1]);
left++;
}
ans = max(ans,left-i+1);
}
return ans;
}
};