Leetcode394. 字符串解码
思路:递归
字母直接加入到 r e s res res中,碰到数字求出数字长度(重复的次数),递归后半段,将右边重复出现的字符接在 r e s res res后面,返回 r e s res res
class Solution {
public:
string decodeString(string s) {
int u = 0;
return dfs(s, u);
}
string dfs(string& s, int& u) {
string res;
while (u < s.size() && s[u] != ']') {
if (s[u] >= 'a' && s[u] <= 'z' || s[u] >= 'A' && s[u] <= 'Z') res += s[u ++ ];
if (s[u] >= '0' && s[u] <= '9') {
int k = u;
while (s[u] >= '0' && s[u] <= '9') u ++ ;
int x = stoi(s.substr(k, u - k));
u = u + 1;
string y = dfs(s, u);
while (x -- ) res += y;
u ++ ;
}
}
return res;
}
};
Leetcode399. 除法求值
思路:哈希+floyd
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
unordered_set<string> S;
unordered_map<string, unordered_map<string, double>> d;
for (int i = 0; i < equations.size(); i ++ ) {
auto a = equations[i][0], b = equations[i][1];
auto c = values[i];
d[a][b] = c, d[b][a] = 1 / c;
S.insert(a), S.insert(b);
}
for (auto k : S)
for (auto i : S)
for (auto j : S)
if (d[i][k] && d[k][j])
d[i][j] = d[i][k] * d[k][j];
vector<double> res;
for (auto & t : queries) {
auto a = t[0], b = t[1];
if (d[a][b]) res.push_back(d[a][b]);
else res.push_back(-1.0);
}
return res;
}
};
Leetcode406. 根据身高重建队列
在这里插入代码片
Leetcode416. 分割等和子集
class Solution {
public:
bool canPartition(vector<int>& nums) {
int n = nums.size(), s = 0;
for (auto& t : nums) s += t;
if (s & 1) return false;
s /= 2;
vector<int> f(s + 1);
f[0] = 1;
for (auto& t : nums)
for (int j = s; j >= t; j -- )
f[j] |= f[j - t];
return f[s];
}
};
Leetcode437. 路径总和 III
思路:前缀和
/**
* 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:
unordered_map<int, int> cnt;
int res = 0;
int pathSum(TreeNode* root, int sum) {
cnt[0] ++ ;
dfs(root, sum, 0);
return res;
}
void dfs(TreeNode* root, int sum, int cur){
if (!root) return ;
cur += root->val;
res += cnt[cur - sum];
cnt[cur] ++ ;
dfs(root->left, sum, cur), dfs(root->right, sum, cur);
cnt[cur] -- ;
}
};