题目地址:
https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/
给定一个字符串,再给定一个数 k k k,从左向右扫描,要求每遇到连续的长度为 k k k的相同字符,则将这些字符删去,并将剩下的字符串连起来,这样不停删除。求最后剩下的字符串。
可以用栈,存每个字符以及其出现的次数,次数每次模 k k k。如果个数归零了则pop掉。代码如下:
class Solution {
public:
#define x first
#define y second
string removeDuplicates(string s, int k) {
vector<pair<char, int>> stk;
for (int i = 0; i < s.size(); i++) {
int j = i;
while (j < s.size() && s[i] == s[j]) j++;
if (stk.empty() || stk.back().x != s[i])
stk.push_back({s[i], (j - i) % k});
else
stk.back().y = (stk.back().y + j - i) % k;
if (!stk.back().y) stk.pop_back();
i = j - 1;
}
string res;
for (auto &p : stk) res.insert(res.end(), p.y, p.x);
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。