uacs2024

导航

leetcode 3090. 每个字符最多出现两次的最长子字符串

3090. 每个字符最多出现两次的最长子字符串

给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的最大长度。

 

使用unordered_map

class Solution {
public:
    int maximumLengthSubstring(string s) {
        int size = s.size();
        if(size <= 2)  return size;
        //now表示当前符合条件的字符串长度
        int resMax = 0, now = 0,lastRepeatTwice = 0;//lastRepeatTwice表示没有字符重复三次的开端
        unordered_map<char,int> letterAdded;
        for(int i = 0;i < size;i++){
            if(letterAdded[s[i]] == 2){
                resMax = max(resMax,now);
                int j;
                //j指针从没有字符重复三次的开端开始寻找重复三次的字符中的第一个,先对这第一个之前的字符都减一次
                for(j = lastRepeatTwice;s[j] != s[i];j++)  letterAdded[s[j]]--;
                letterAdded[s[j]]--;//再对这个重复三次的字符减一次
                lastRepeatTwice = j + 1;      
                now = i - j - 1;//now = (i - 1) - lastRepeatTwice + 1 = (i - 1) - (j + 1) + 1 = i - j - 1
            }
            letterAdded[s[i]]++;now++;
        }
        return max(resMax,now);
    }
};

 使用数组,更快更简洁

class Solution {
public:
    int maximumLengthSubstring(string s) {
        int size = s.size();
        if(size <= 2)  return size;
        int left = 0, resMax = 0;
        int letter[26]{};//这道题的字符串只由小写字母组成
        for(int i = 0;i < size;i++){
            int num = s[i] - 'a';
            letter[num]++;
            while(letter[num] > 2){
                letter[s[left] - 'a']--;//直到把letter[s[i]]减到≤2
                left++;
            }
            resMax = max(resMax,i - left + 1);
        }
        return resMax;
    }
};

 

posted on 2024-12-06 19:07  ᶜʸᵃⁿ  阅读(17)  评论(0)    收藏  举报