int minInsertionsOptimized(char* s) {
int n = strlen(s);
int* stack = (int*)malloc(n * sizeof(int));
int top = -1;
int insertions = 0;
for (int i = 0; i < n; i++) {
char c = s[i];
if (c == '(' || c == '[') {
// 左括号直接入栈
stack[++top] = c;
} else {
// 处理右括号
if (top == -1) {
// 栈为空,需要插入对应的左括号
insertions++;
} else {
char topChar = stack[top];
if ((c == ')' && topChar == '(') || (c == ']' && topChar == '[')) {
// 匹配成功,弹出栈顶
top--;
} else {
// 不匹配,需要插入对应的左括号
insertions++;
top--; // 假设匹配成功,弹出栈顶
i--; // 重新处理当前字符
}
}
}
}
// 栈中剩余的左括号都需要插入对应的右括号
insertions += (top + 1);
free(stack);
return insertions;
}
// 更简洁的栈解法
int minInsertionsStack(char* s) {
int n = strlen(s);
int* stack = (int*)malloc(n * sizeof(int));
int top = -1;
int count = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '(' || s[i] == '[') {
// 左括号入栈
stack[++top] = s[i];
} else {
// 右括号
if (top == -1) {
// 栈为空,需要插入一个左括号
count++;
} else {
// 检查是否匹配
if ((stack[top] == '(' && s[i] == ')') ||
(stack[top] == '[' && s[i] == ']')) {
top--; // 匹配成功,弹出栈顶
} else {
// 不匹配,需要插入一个对应的左括号
count++;
top--; // 假设匹配成功
}
}
}
}
// 栈中剩余的左括号都需要插入对应的右括号
count += (top + 1);
free(stack);
return count;
}