Every day a Leetcode
题目来源:3223. 操作后字符串的最短长度
解法1:哈希
操作次数取决于每种字母的出现次数,与字母的位置无关。
假设某个字母出现了 c 次,那么操作后该字母最少能剩下多少?
根据题意,只有当 c≥3 时才能操作,每次操作可以把 c 减少 2。
- 如果 c=3, 5, 7,⋯ 是奇数,那么不断减 2,最终 c=1。
- 如果 c=4, 6, 8,⋯ 是偶数,那么不断减 2,最终 c=2。
累加每种字母最终剩下的 c,即为答案。
代码:
/*
* @lc app=leetcode.cn id=3223 lang=cpp
*
* [3223] 操作后字符串的最短长度
*/
// @lc code=start
class Solution
{
public:
int minimumLength(string s)
{
unordered_map<char, int> freq;
for (char &c : s)
freq[c]++;
int ans = 0;
for (auto &[c, cnt] : freq)
ans += cnt % 2 ? 1 : 2;
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n+∣Σ∣),其中 n 是字符串 s 的长度,∣Σ∣ 是字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。
空间复杂度:O(∣Σ∣),其中 ∣Σ∣ 是字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。