无重复字符的最长子串(滑动窗口)
给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。
示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路:滑动窗口,外层循环移动左指针,内层循环移动右指针,需要注意的是要先判断右指针所指字符是否重复,如果重复就不要移动,所以right的初始值为-1.
class Solution { public: int lengthOfLongestSubstring(string s) { set<char> st; int maxLen=0; int right=-1; int n = s.size(); //枚举左指针的位置 for(int left=0;left<n;left++){ if(left!=0){ //当一个字串长度找到,去除字串开头的字符 st.erase(s[left-1]); } while(right+1<n&&st.count(s[right+1])==0){//右指针所指字符不存在 st.insert(s[right+1]); ++right; //右指针向右移动 } //右指针所指字符存在,计算长度 maxLen = max(maxLen,right-left+1); } return maxLen; } };
浙公网安备 33010602011771号