leetcode 第 390 场周赛
3090. 每个字符最多出现两次的最长子字符串
简单题
class Solution {
public:
int maximumLengthSubstring(string s) {
int n = s.size(), ans = 0;
unordered_map<char, int> mp;
for (int i = 0; i < n; ++i) {
mp.clear();
for (int j = i; j < n; ++j) {
++mp[s[j]];
if (mp[s[j]] > 2) break;
ans = max(ans, j - i + 1);
}
}
return ans;
}
};
3091. 执行操作使数据元素之和大于等于 K
简单题 模拟一下数据or推导出公式
class Solution {
public:
int minOperations(int k) {
for (int i = 0; i <= 100001; i++) {
int num = (1 + i / 2) * (1 + i - i / 2);
if (num >= k) return i;
}
return -1;
}
};
3092. 最高频率的 ID
简单题 知道multiset用法即可
class Solution {
public:
vector<long long> mostFrequentIDs(vector<int> &nums, vector<int> &freq) {
int n = nums.size();
unordered_map<int, long long> mp;
multiset<long long> ms;
vector<long long> ans(n);
for (int i = 0; i < n; i++) {
auto it = ms.find(mp[nums[i]]);
if (it != ms.end()) {
ms.erase(it);
}
mp[nums[i]] += freq[i];
ms.insert(mp[nums[i]]);
ans[i] = *ms.rbegin();
}
return ans;
}
};
3093. 最长公共后缀查询
字典树模板题
题解 https://www.bilibili.com/video/BV1wr421h7xY/?vd_source=731560abe8df5b2a88bbf9e188fb46f6
class Solution {
public:
struct Node {
Node *sons[26]{};
int id;
int len = INT_MAX;
Node() {};
};
vector<int> stringIndices(vector<string> &wordsContainer, vector<string> &wordsQuery) {
int n1 = wordsContainer.size(), n2 = wordsQuery.size();
// 构建字典树
Node *root = new Node();
for (int i = 0; i < n1; i++) {
string s = wordsContainer[i];
int len = s.length();
Node *cur = root;
if (len < cur->len) {
cur->id = i;
cur->len = len;
}
for (int j = len - 1; j >= 0; j--) {
int temp = s[j] - 'a';
if (cur->sons[temp] == nullptr) {
cur->sons[temp] = new Node();
}
cur = cur->sons[temp];
if (len < cur->len) {
cur->id = i;
cur->len = len;
}
}
}
vector<int> ans(n2, -1);
for (int i = 0; i < n2; i++) {
string s = wordsQuery[i];
int len = s.length();
Node *cur = root;
for (int j = len - 1; j >= 0 && cur->sons[s[j] - 'a'] != nullptr; j--) {
cur = cur->sons[s[j] - 'a'];
}
ans[i] = cur->id;
}
return ans;
}
};