LeetCode——3. Longest Substring Without Repeating Characters

题目:

这里用的是滑动窗口的思路,有两种实现方式:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
     
        unordered_map<char, int> vocab;
        int maxLen = 0;
        int left = -1;
        for(int i=0; i<s.size(); i++){
            if(vocab.count(s[i]) && vocab[s[i]]>left){
                left = vocab[s[i]];
            }
            vocab[s[i]] = i;
            maxLen = max(maxLen, i - left);
        }
        return maxLen;
    }
};

注意left = -1,这里是用来应对s.size=" "时的情况的(此时最终输出应为1)。

上面这种要快一点,思路就是记录每个字母出现的位置,然后根据位置来调整窗口的left指向的位置(即调整窗口大小)。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxLen = 0;
        int left = 0;
        unordered_set<char> dict;
  
        for(int i=0; i<s.size(); i++){
            while(dict.find(s[i])!=dict.end()){
                dict.erase(s[left]);
                left++;
            }
            maxLen = max(maxLen, i-left+1);
            dict.insert(s[i]);
        }
        return maxLen;
    }
};

这种的话就是每次都遍历一次窗口,看窗口中有没有重复的字符,如果有那么久将left右移一格,直到窗口中所有字符都唯一。第一种方法就是优化了遍历的这一个步骤,所以更加快一些。

posted @ 2019-08-14 10:43  夜溅樱  阅读(90)  评论(0编辑  收藏  举报