《从头再来》剑指offer.48 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

采用双指针和哈希表来解决这道题。最初始的时候,两个指针都指向字符串的首位,然后移动右指针来不断扩大非重复字串的长度,然后将右指针指向的值加入到哈希表中,如果在加入的时候判断到哈希表中某个值重复了(>1),则重复的移动左指针,直到右指针指向的值不重复。每次移动右指针,都更新一下最长子字符串的长度。

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() <= 1)   return s.size();
        unordered_map<char, int>    map;
        int i = 0, j = 0;//左右指针
        int result = 0;
        while(j < s.size()){
            map[s[j]]++;
            while(map[s[j]] > 1){
                map[s[i]]--;
                ++i;
            }
            result = max(result, j-i+1);
            j++;
        }
        return result;
    }
};
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.size() <= 1)   return s.size();
        unordered_map<char, int>    map;//第一个参数为存入的字符,第二个参数为字符存入的次数
        int i = 0, j = 0;
        int result = 1;//此时至少为1
        for(j = 0; j < s.size(); ++j){//右指针移动
            map[s[j]]++;
            while(map[s[j]] > 1){
                //要循环的对i进行递增,直到哈希表中的子串不重复,所以要用while,而不是只用if判断,使得i只移动一步
                map[s[i]]--;
                i++;
            }
            result = max(result, j-i+1);
        }
        return result;
    }
};

《从头再来》

 

posted @ 2021-06-09 21:07  丶原来是枝知啊i  阅读(65)  评论(0)    收藏  举报