LeetCode 3.无重复字符的最长子串——滑动窗口

  • 链接 :原题
  • 题意 : 给定一个字符串s,寻找没有重复字符的最长子串,输出长度。
    例如 pwwkew 最长子串 wke。则长度为3.
  • 思路 :
    首先注意一下,子串 ≠ 子序列,子串是连续的。
    此题用的是双指针的一个应用,滑动窗口。思路即是,初始时,left = right = 0,然后只要满足条件 right指针右移,维护一个ans 代表最长子串的长度。如果不满足条件,则left 右移,缩减窗口,直到再满足条件,则right右移。
    此题要用到 unordered_set ,无序集合更快一些。
  • 代码:
class Solution {
    
    
public:
    int lengthOfLongestSubstring(string s) {
    
    
        int left = 0, right = 0, ans = 0;
        int len = s.length();
        unordered_set<char> vis;
        while(left < len){
    
    
        	//右指针移动,窗口增大
            while(right < len && !vis.count(s[right])){
    
    
                vis.insert(s[right]);
                right++;
            }
            //维护一个最长子串
            ans = max(ans,right - left);
            //左指针移动
            vis.erase(s[left]);
            left ++;
        }
        return ans;
    }
};
  • 遇到的问题:
    一开始以为右指针移动完即可,应该是左指针。而且直接用set,有些慢。

おすすめ

転載: blog.csdn.net/qq_39763472/article/details/105903132