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. 统计打字方案数
开始想着组合,后面找规律,没有做出来,看了其他的题解,使用动态规划的方式。
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 比较方便的来做, 表示 , 表示 。
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);
}
};