Every day a Leetcode
题目来源:3170. 删除星号以后字典序最小的字符串
解法1:栈
由于要去掉最小的字母,为了让字典序尽量小,相比去掉前面的字母,去掉后面的字母更好。
从左到右遍历字符串 s,用 26 个栈模拟,其中第 i 个栈维护第 i 个小写字母的下标。
遇到 * 时,弹出第一个非空栈的栈顶下标。
最后把所有栈顶下标对应的字母组合起来,即为答案。
具体实现时,把要删除的字符修改成 *,最后把字符串的 * 全部去掉即为答案。
代码:
/*
* @lc app=leetcode.cn id=3170 lang=cpp
*
* [3170] 删除星号以后字典序最小的字符串
*/
// @lc code=start
class Solution
{
public:
string clearStars(string s)
{
int n = s.length();
stack<int> idx[26];
for (int i = 0; i < n; i++)
{
if (s[i] != '*')
{
idx[s[i] - 'a'].push(i);
continue;
}
// 遇到 *
for (auto &stk : idx)
{
if (!stk.empty())
{
s[stk.top()] = '*';
stk.pop();
break;
}
}
}
string ans;
for (char &c : s)
if (c != '*')
ans.push_back(c);
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n∣Σ∣),其中 n 是字符串 s 的长度,∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。
空间复杂度:O(n+∣Σ∣),其中 n 是字符串 s 的长度,∣Σ∣ 为字符集合的大小,本题字符均为小写字母,所以 ∣Σ∣=26。