【LeetCode】第 291 场周赛

113 阅读1分钟

第一题

image.png 暴力

class Solution {
public:
    string removeDigit(string number, char digit) {
        string res = "";
        for(int i=0; i<number.size(); i++){
            if(number[i] == digit){
                string t = number.substr(0, i) + number.substr(i+1, number.size()-i);
                if(t > res){
                    res = t;
                }
            }
        } 
        return res;
    }
};

第二题

image.png

哈希表保存最近的位置

class Solution {
public:
    int minimumCardPickup(vector<int>& cards) {
        map<int, int> map;
        int res = INT_MAX, n =cards.size();
        for(int i=0; i<n; i++){
            if(map.count(cards[i])){
                if(res > i-map[cards[i]]){
                    res = i - map[cards[i]]+1;
                }
            }
            map[cards[i]] = i;
        }
        return res == INT_MAX ? -1 : res;
    }
};

第三题

image.png

暴力

class Solution {
public:
    int countDistinct(vector<int>& nums, int k, int p) {
        int n = nums.size();
        unordered_set<string> set;
        for(int i=0; i<n; i++){
            string t;
            int cnt = 0;
            for(int j=i; j<n; j++){
                if(nums[j]%p == 0) cnt++;
                if(cnt > k) break;
                t += to_string(nums[j])+"|";
                set.insert(t);
            }
        }
        return set.size();
    }
};

第四题

image.png

动态规划

image.png

class Solution {
public:
    long long appealSum(string s) {
        int n = s.size();
        vector<int> f(n);
        // 单个字母也有引力,所以默认 -1
        vector<int> pos(26, -1);
        pos[s[0]-'a'] = 0;
        f[0] = 1;
        for(int i=1; i<n; i++){
            f[i] = f[i-1] + i - pos[s[i]-'a'];
            // 更新最近字母的位置
            pos[s[i]-'a'] = i;
        }
        long long res = 0;
        for(int i=0; i<n; i++) res += f[i];
        return res;
    }
};