Leetcode Weekly context

【第451场](https://leetcode.cn/contest/weekly-contest-451/)

2.移除相邻字符

给你一个由小写英文字母组成的字符串 s。

你 必须 在字符串 s 中至少存在两个 连续 字符时,反复执行以下操作:

移除字符串中 最左边 的一对按照字母表 连续 的相邻字符(无论是按顺序还是逆序,例如 ‘a’ 和 ‘b’,或 ‘b’ 和 ‘a’)。
将剩余字符向左移动以填补空隙。
当无法再执行任何操作时,返回最终的字符串。

注意:字母表是循环的,因此 ‘a’ 和 ‘z’ 也视为连续。

思路
当我们消除某两个字符后,这两个字符的前后字符又有可能继续消除,我们可以想到栈,当我们添加某个元素后
取栈顶元素看是否连续,若连续则消除栈顶元素,接着继续添加元素。
最后栈中的元素就是不可能消除的了,从栈顶到栈顶则是答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
string resultingString(string s) {
auto check = [](char a, char b) -> bool {
if(abs(a - b) == 1 || (a == 'a' && b == 'z') || (b == 'a' && a == 'z')) {
return true;
}
return false;
};
string sk;
for(int i = 0; i<s.size(); ++i) {
sk += s[i];
if(sk.size() >= 2 && check(sk[sk.size() - 2], sk.back())) {
sk.resize(sk.size() - 2);
}
}
return sk;
}
};
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2025 Xudong0722
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信