难度中等7891
给定一个字符串 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
由英文字母、数字、符号和空格组成class Solution { public: //有无重复,有重复返回重复元素的位置 int find(string s,int i,int j){ for(int k=i;k<j;k++){ if(s[k]==s[j]) return k; } return -1; } int lengthOfLongestSubstring(string s) { if(s.size()<=1) return s.size(); //start 滑动窗口初始位置 int start=0; //maxLength 滑动窗口最大值,maxTemp 滑动窗口的当前大小 int maxLength=1; int maxTemp=1; for(int cur=1;cur<s.size();++cur){ int nowStart=find(s,start,cur); //无重复元素,滑动窗口大小+1 if(nowStart==-1){ maxTemp++; //有重复,窗口初始位置为重复出现元素下一个元素 }else{ start=nowStart+1; maxTemp=cur-start+1; } if(maxLength<maxTemp) maxLength=maxTemp; } return maxLength; } };
class Solution { public: int lengthOfLongestSubstring(string s) { // 滑动窗口思想 occ无重复set, 每个字符作为初始元素的最长无重复子串 unordered_set<char> occ; int n=s.size(); // rk表示右指针, ans表示无重复最长子串长度 int rk=-1,ans=0; for(int i=0;i<n;++i){ if(i!=0){ occ.erase(s[i-1]); } while(rk+1<n && !occ.count(s[rk+1])){ occ.insert(s[rk+1]); ++rk; } ans=max(ans,rk-i+1); if(rk+1==n) break; } return ans; } };