题目来源:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目内容
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
碎碎念
自己写出来的代码,一开始模拟面试30min没有做出来,之后自己思考了一下解决了,加油。滑动窗口还是比较好理解的,有双端队列、单队列。思想很棒,将复杂度降了一个量级。
本题:滑动窗口,利用队列的性质记录已经检索过的元素,记住,别回头,往前走,这个就是优化。
代码
class Solution {
public:
int max(int a,int b){
return a>b?a:b;
}
int lengthOfLongestSubstring(string s) {
//滑动窗口,利用队列,先进后出的性质
//算法复杂度O(N),空间复杂度O(1)
int maxLength=0;
int flag[129]={0};//标记数组
queue<char> q;//存放读取的队列
for(int i=0;i<s.length();i++){
q.push(s[i]);
if(flag[s[i]]==0){
flag[s[i]]=1;
maxLength=max(q.size(),maxLength);
}else{
while(q.front()!=s[i]){
flag[q.front()]=0;
q.pop();
}
q.pop();
}
}
return maxLength;
}
};