我有一个包含字符 <code>(</code> 和 <code>)</code> 的字符串,例如 <code>)()(())(</code>。请找出使其平衡所需的最小交换次数。我们可以交换任意字符,它们不需要相邻。如果无法达到平衡,则返回 -1。
对于示例 <code>)()(())(</code>,我们可以通过交换第一个和最后一个字符将其变成平衡字符串 <code>(()(()))</code>,所以交换次数为 1,答案是 <code>1</code>。
字符串的长度范围为 <code>1 到 105</code>
这是我的代码:
public static int solve(String s) {
while(true) {
int pos = s.indexOf("()");
if(pos == -1) break;
s = s.substring(0, pos) + s.substring(pos+2);
}
int open = 0, close = 0;
for(char c : s.toCharArray()) {
if(c == '(') open++;
else close++;
}
if(open == close) return open;
return -1;
}
上述方法在时间复杂度上不够高效。请问如何用更少的时间复杂度来解决这个问题?