使括号平衡的最小交换次数
Last updated
Last updated
def MinSwapBracketBalancing(Brackets: list):
# 首先遍历字符串,获取所有左括号的位置
leftBrackets = []
leftBrackets.extend([ idx for idx, x in enumerate(Brackets) if x == '['])
if len(leftBrackets) != len(Brackets) // 2:
return 0
count = 0 # 当前还未平衡的左括号数量
pos = 0 # 下一个左括号的位置
sum = 0 # 总共移动次数
i = 0
while i < len(Brackets):
if Brackets[i] == '[':
# 当前遍历括号为左括号
count += 1
pos += 1
else:
# 当前括号为右括号
count -= 1 # 不平衡左括号 - 1
if count < 0:
# 右括号在不平衡左括号之前出现
# 交换两括号位置
Brackets[i], Brackets[leftBrackets[pos]] = Brackets[leftBrackets[pos]],Brackets[i]
sum += leftBrackets[pos] - i
count = 0
pos += 1
i += 1
i += 1
return sumint MinSwapsBracketBalancing(string Brackets) {
vector<int> leftBrackets;
// Get positions of all left brackets
for (auto i = 0;i<Brackets.size(); i++) {
if (Brackets[i] == '[')
leftBrackets.push_back(i);
}
auto count = 0; // Current unbalanced left brackets
auto pos = 0; // Next position of next left brackets
auto sum = 0; // Total moves to balance brackets
for (auto i = 0; i < Brackets.size(); i++) {
if (Brackets[i] == '[') {
count++;
pos++;
}
else if (--count < 0) {
// Get unbalanced right bracket
// Swap it with next left bracket
swap(Brackets[i], Brackets[leftBrackets[pos]]);
sum += leftBrackets[pos] - i;
}
}
return sum;
}