给定一个字符串 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 由英文字母、数字、符号和空格组成
解题思路:
用队列存储子串,用哈希表标记队列中的元素
遍历数组,从数组第一个元素入队
如果队列中存在与入队元素相同的元素比如[abca],则把队中最左边相同元素和其左边元素出队,比如[abca]→[bca]
如果队列中不存在与入队元素相同的元素,则用哈希表标记入队元素的值为true
用变量length记录最大子串长度(具体实现看代码)
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size()==0) return 0;//排除s为空的情况
unordered_map<char,bool> map; //哈希表
queue<char> q; // 队列
// count 记录子串长度,length记录最大子串
int count=0,length=0;
for(char c : s) { // 遍历数组s
// 如果队列已存与入队元素在相同元素
if(map[c]==true) {
// 把相同元素之前的元素出队
while(q.front()!=c) {
// 出队元素的值从哈希表中删除
map.erase(q.front());
q.pop();
count–; // 子串元素个数更新
}
q.pop(); // 相同元素出队(上面没出)
q.push(c); // 入队元素入队
}
else { // 队列中不存在相同元素
map[c]=true; // 哈希表标记该元素
q.push(c); // 该元素入队
count++; // 子串长度更新
}
// length记录最大子串长度
if(length<count)
length=count;
}
return length; //返回最大子串长度
}
};
建议:可以自己带入题目的例子推一遍。