用栈来计算深度,但是此题中输入已经保证了括号一定是匹配的,所以不需要真的用栈
直观解法1:每次操作使得A集合和B集合的深度相差最小
class Solution {
public:
// 使得两组字符串的深度相差最小
vector<int> maxDepthAfterSplit(string seq) {
vector<int> ans;
int A_depth = 0, B_depth = 0; // A和B的当前深度
for(char i : seq)
{
if(i == '(') // 加深度
{
if(A_depth >= B_depth)
++B_depth, ans.push_back(1);
else
++A_depth, ans.push_back(0);
}
else // 减深度
{
if(A_depth >= B_depth) // 等号一定要对应,使其匹配
--A_depth, ans.push_back(0);
else
--B_depth, ans.push_back(1);
}
}
return ans;
}
};
方法2:
使挨着的左括号分属与不同的集合即可,右括号同理
使用异或操作^
class Solution {
public:
vector<int> maxDepthAfterSplit(string seq) {
vector<int> ans;
int pre = 1; // 标记前一个字符是不是A
for(char i : seq)
{
if(i == '(') pre ^= 1, ans.push_back(pre);
else
ans.push_back(pre), pre ^= 1; // 先push保证匹配
}
return ans;
}
};
本文探讨了如何将括号序列划分为两个集合,使它们的深度差最小。提出两种方法,一是比较并调整两集合深度,二是利用异或操作简化处理。适用于算法设计与数据结构优化的学习。

被折叠的 条评论
为什么被折叠?



