'[' ,']','(',‘)’ 字符串,请问最少插入多少个括号就能使这个字符串括号成对匹配

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;
}

全部评论
栈模拟方法存在缺陷
点赞 回复 分享
发布于 08-26 15:31 陕西

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务