class Solution {
public:
int longestPalindromeSubseq(string s) {
int n = s.size();
vector<vector<int>>dp(n, vector<int>(n, 0));
for(int i = 0; i < n; i ++)
dp[i][i] = 1;
for(int i = n - 2; i >= 0; i --)
for(int j = i + 1; j < n; j ++)
if(s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2;
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
return dp[0][n - 1];
}
};
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int sum = 0;
for(auto c : machines)
sum += c;
if(sum % machines.size() != 0)
return -1;
int target = sum / machines.size();
int res = 0, balance = 0;
for(int i = 0; i < machines.size(); i ++)
{
balance += machines[i] - target;
res = max(res, max(abs(balance), machines[i] - target));
}
return res;
}
};
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int>dp(amount + 1);
dp[0] = 1;
for(auto c : coins)
for(int i = 0; i + c <= amount; i ++)
dp[i + c] += dp[i];
return dp[amount];
}
};
class Solution {
public:
int total;
int count;
int n_cols;
unordered_map<int, int>blackMap;
Solution(int n_rows, int n_cols) {
this->n_cols = n_cols;
total = count = n_rows * n_cols;
}
vector<int> flip() {
int r = rand() % count;
while(blackMap.count(r))
r = blackMap[r];
blackMap[r] = --count;
return {r / n_cols, r % n_cols};
}
void reset() {
count = total;
blackMap.clear();
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(n_rows, n_cols);
* vector<int> param_1 = obj->flip();
* obj->reset();
*/
class Solution {
public:
bool detectCapitalUse(string word) {
int upper = 0;
int lower = 0;
for(int i = 0; i < word.size(); i ++)
if(word[i] >= 'a')
lower ++;
else
upper ++;
if(upper == word.size())
return true;
if(lower == word.size())
return true;
if(word[0] < 'a' && upper == 1)
return true;
return false;
}
};