【LeetCode】第 292 场周赛题解

207 阅读1分钟

6056. 字符串中最大的 3 位相同数字

字符串操作

class Solution {
public:
    string largestGoodInteger(string nums) {
        int n = nums.size(), maxv = 0;
        string res;
        for(int i=0; i<=n-3; i++){
            if(nums[i] == nums[i+1] && nums[i] == nums[i+2]){
                string t = nums.substr(i, 3);
                int v = stoi(t);
                if(v >= maxv){
                    maxv = v;
                    res = t;
                }
            }
        } 
        return res;
    }
};

6057. 统计值等于子树平均值的节点数

使用 dfs 记录 sum 和 cnt, 累计数量

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int res = 0;
     pair<int, int> dfs(TreeNode* root){
        if(root->left == NULL && root->right == NULL){
            res++;
            return {root->val, 1};
        }
        int sum = root->val;
        int cnt = 1;
        if(root->left){
            pair<int, int> p = dfs(root->left);
            sum += p.first;
            cnt += p.second;
        }
        if(root->right){
            pair<int, int> p = dfs(root->right);
            sum += p.first;
            cnt += p.second;
        }
        if(root->val == sum/cnt){
            res++;
        }
        return { sum, cnt};
    }
    int averageOfSubtree(TreeNode* root) {
        dfs(root);
        return res;
    }
};

6058. 统计打字方案数

开始想着组合,后面找规律,没有做出来,看了其他的题解,使用动态规划的方式。

image.png

class Solution {
public:
    static const int N = 100010;
    int f[N], g[N];
    int countTexts(string s) {
        f[0] = g[0] = 1; // 前 i 个字母组成的数量
        f[1] = g[1] = 1;
        f[2] = g[2] = 2;
        f[3] = g[3] = 4;
        int mod = 1e9+7;
        for(int i=4; i<N; i++){
            f[i] = ((long long)f[i-1]+f[i-2]+f[i-3])%mod;
            g[i] = ((long long)g[i-1]+g[i-2]+g[i-3]+g[i-4])%mod;
        }
        int res = 1;
        int n = s.size();
        for(int i=0; i<n; i++){
            int j = i+1;
            int cnt = 1;
            while(j < n && s[i] == s[j]) cnt++, j++;
            long long t = 0;
            if(s[i] == '7' || s[i] == '9'){
                res = ((long long)res*g[cnt])%mod;
            }else{
                res = ((long long)res * f[cnt])%mod;
            }
            i = j-1;
        }
        return res;
    }
};

6059. 检查是否有合法括号字符串路径

没有时间做了,可以用 dfs 比较方便的来做, (( 表示 +1+1)) 表示 1-1

class Solution {
public:
    vector<vector<char>> g;
    int visit[105][105][210];
    int n, m;
    bool dfs(int x, int y, int c){
        if(c > (n-x+m-y-1)) return false; // 剩余的格子全部 “)” 也不能组成合法
        if(visit[x][y][c]) return false; // 访问的位置过滤
        if(x == n-1 && y == m-1) return c == 1;
        visit[x][y][c] = true;
        c += g[x][y] == '(' ? 1 : -1;
        return (c >= 0 && ((x < n-1 && dfs(x+1, y, c)) ||(y < m-1 && dfs(x, y+1, c))));
    }
    bool hasValidPath(vector<vector<char>>& grid) {
        n = grid.size(), m = grid[0].size();
        // 括号需要匹配所以需要是偶数,开始和结束的字符过滤
        if((n+m-1)%2 != 0 || grid[0][0] == ')' || grid[n-1][m-1] == '(') return false;
        g = grid;
        memset(visit, false, sizeof visit);
        return dfs(0, 0, 0);
    }
};