第 199 场周赛

重新排列字符串

1
2
3
4
5
6
7
8
9
class Solution {
public:
string restoreString(string s, vector<int>& indices) {
string res = s;
for(int i = 0; i < indices.size(); ++i)
res[indices[i]] = s[i];
return res;
}
};

灯泡开关 IV

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
int minFlips(string target) {
int flag = true;
int res = 0;
for(int i=0; i<target.size(); i++) {
if(flag && target[i] == '1') {
flag = false;
res++;
} else if(flag == false && target[i] == '0') {
flag = true;
res++;
}
}
return res;
}
};

好叶子节点对的数量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 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 ans;
vector<int> dfs(TreeNode* root, int distance) {
if (root->left == nullptr&&root->right == nullptr)
return{ 1 };
vector<int>v1, v2,v3;
if (root->left)
v1 = dfs(root->left, distance);
if (root->right)
v2 = dfs(root->right, distance);
for (int i : v1)
for (int j : v2)
if (i + j <= distance)
ans++;
for (int i : v1)
v3.push_back(i + 1);
for (int j : v2)
v3.push_back(j + 1);
return v3;
}
int countPairs(TreeNode* root, int distance) {
ans = 0;
dfs(root, distance);
return ans;
}
};

压缩字符串 II

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
int dp[105][105];
int n;
int dfs(int st, int k, string& s) {
if (st == n) return 0;
int& r = dp[st][k];
if (r != -1) return r;
if (k) r = dfs(st + 1, k - 1, s); // case1: 删除当前位置字符

// case2: 保留当前字符,并枚举该字符连续的长度(所以遇到不同字符必须删除,才能维护其连续性)
int c = 1; // 记录当前字符的连续个数
for (int i = st + 1; i <= n; i++) {
int t = dfs(i, k, s) + 1 + (c >= 100 ? 3 : c >= 10 ? 2 : c > 1 ? 1 : 0);
if (r == -1 || r > t) r = t;
if (i == n) break;
if (s[i] == s[st]) c++; // 相同, 个数加1
else if (k-- <= 0) break; // 否则删除不同的字符
}
return r;
}
int getLengthOfOptimalCompression(string s, int k) {
n = s.size();
memset(dp, -1, sizeof dp);
dfs(0, k, s);
return dp[0][k];
}
};
Donate? comment?