首先遍历字符串,利用哈希表存储每个字母是否出现。然后从字母z开始向前遍历,每次判断是否同时出现字母的大小写,如果出现则返回答案。
class Solution {
public:
unordered_map<char,int> map;
string greatestLetter(string s) {
string res; //返回值
for(auto &c : s) { //保存每个字母出现的次数
map[c]++;
}
for(char c = 'z';c >= 'a';c--) { //从z向前遍历,返回第一个出现大小写的字母
if(map.count(c) && map.count(c - 32)) {
return string(1, c - 32);
}
}
return res;
}
};
每个个位数为k的数都可以拆分成一个对10取余为0的整数和k,比如 sum = 58 ,k = 9;
sum = 39 + 19 = (30 + 9) + (10 + 9),因此题目转化为sum - i * k 是否能整除k。
class Solution {
public:
int minimumNumbers(int num, int k) {
if(num == 0) return 0;
for(int i = 1;i <= num;i++) {
int t = num - i * k;
if(t >= 0 && t % 10 == 0) return i;
}
return -1;
}
};
class Solution {
public:
int longestSubsequence(string s, int k) {
int res = 0;
for(auto &x : s) {
if(x == '0') res++;
}
long long ans = 0,w = 1;
for(int i = s.length() - 1;i >= 0;i--,w <<= 1) {
if(s[i] == '1') ans += w;
if(ans > k) return res;
if(s[i] == '1') res++;
if(w > 2e9) return res; //处理溢出
}
return res;
}
};
dp
typedef long long LL;
class Solution {
public:
long long sellingWood(int m, int n, vector<vector<int>>& prices) {
vector<vector<LL>> dp(m + 1, vector<LL> (n + 1));
//dp[i][j]表示高度为i,宽度为j的木块分割的最大价值
//有两种分割方式,垂直和水平。
//垂直:dp[i][j] = dp[i][k] + dp[i][j - k]; k < j
//水平:dp[i][j] = dp[k][j] + dp[i - k][j]; k < i
//再取最大值
for(auto &p : prices) {
int h = p[0],w = p[1],v = p[2];
dp[h][w] = v; //初始化
}
for(int i = 1;i <= m;i++)
for(int j = 1;j <= n;j++) { //水平
for(int k = 1;k < i;k++) {
dp[i][j] = max(dp[i][j], dp[k][j] + dp[i - k][j]);
}
for(int k = 1;k < j;k++) {
dp[i][j] = max(dp[i][j], dp[i][k] + dp[i][j - k]);
}
}
return dp[m][n];
}
};