2696.删除子串后的字符串最小长度

【LetMeFly】2696.删除子串后的字符串最小长度:栈

力扣题目链接:https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/

给你一个仅由 大写 英文字符组成的字符串 s

你可以对此字符串执行一些操作,在每一步操作中,你可以从 s 中删除 任一个 "AB""CD" 子字符串。

通过执行操作,删除所有 "AB""CD" 子串,返回可获得的最终字符串的 最小 可能长度。

注意,删除子串后,重新连接出的字符串可能会产生新的 "AB""CD" 子串。

 

示例 1:

输入:s = "ABFCACDB"
输出:2
解释:你可以执行下述操作:
- 从 "ABFCACDB" 中删除子串 "AB",得到 s = "FCACDB" 。
- 从 "FCACDB" 中删除子串 "CD",得到 s = "FCAB" 。
- 从 "FCAB" 中删除子串 "AB",得到 s = "FC" 。
最终字符串的长度为 2 。
可以证明 2 是可获得的最小长度。

示例 2:

输入:s = "ACBBD"
输出:5
解释:无法执行操作,字符串长度不变。

 

提示:

  • 1 <= s.length <= 100
  • s 仅由大写英文字母组成

方法一:栈

使用一个栈存放字符串剩下的元素,遍历字符串:

  • 如果当前字符是B并且栈顶元素是AA出栈
  • 否则如果当前字符是D并且栈顶元素是CC出栈
  • 否则当前字符入栈

最终返回栈中元素的个数即可。

  • 时间复杂度$O(len(s))$
  • 空间复杂度$O(len(s))$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
int minLength(string s) {
stack<char> st;
for (char c : s) {
if (c == 'B' && st.size() && st.top() == 'A') {
st.pop();
}
else if (c == 'D' && st.size() && st.top() == 'C') {
st.pop();
}
else {
st.push(c);
}
}
return st.size();
}
};

Python

1
2
3
4
5
6
7
8
9
class Solution:
def minLength(self, s: str) -> int:
st = []
for c in s:
if (c == 'B' and st and st[-1] == 'A') or (c == 'D' and st and st[-1] == 'C'):
st.pop()
else:
st.append(c)
return len(st)

同步发文于CSDN,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/135511159


2696.删除子串后的字符串最小长度
https://blog.letmefly.xyz/2024/01/10/LeetCode 2696.删除子串后的字符串最小长度/
作者
Tisfy
发布于
2024年1月10日
许可协议