每日一水(AI刷题: 括号补全问题) | 豆包MarsCode AI刷题

87 阅读3分钟

每日一水

先说些题外话,AI刷题也是终于出了C++的代码提交了,对于作者这样只系统学过C语言的同学还是很友好的,终于不用写完代码再让AI转成python或者java语言提交了,也是品上细糠了.好了正片开始

问题描述

小R有一个括号字符串 s,他想知道这个字符串是否是有效的。一个括号字符串如果满足以下条件之一,则是有效的:

  1. 它是一个空字符串;
  2. 它可以写成两个有效字符串的连接形式,即 AB
  3. 它可以写成 (A) 的形式,其中 A 是有效字符串。

在每次操作中,小R可以在字符串的任意位置插入一个括号。你需要帮小R计算出,最少需要插入多少个括号才能使括号字符串 s 有效。

例如:当 s = "())" 时,小R需要插入一个左括号使字符串有效,结果为 1

提示

该问题可以看出,是一个左括号配上一个右括号才有效,需要我们找出没有配对的括号数.那么就可以用栈的知识来解决, 下面先来简单介绍一下"栈".

  1. 定义

    • 栈是一种线性数据结构,遵循“后进先出”(Last In, First Out,LIFO)的原则。
    • 这意味着最后进入栈的元素会最先被移除。
  2. 基本操作

    • Push:将元素压入栈顶。
    • Pop:从栈顶移除元素。
    • Peek/Top:查看栈顶元素,但不移除它。
    • IsEmpty:检查栈是否为空。
    • Size:获取栈中元素的数量。

由于

  1. 括号的嵌套特性

    • 括号字符串的有效性通常涉及到嵌套结构,例如 (()) 或 (()())。栈的“后进先出”(LIFO)特性非常适合处理这种嵌套结构。
    • 当你遇到一个左括号 ( 时,你可以将其压入栈中。当你遇到一个右括号 ) 时,你可以从栈顶弹出一个左括号,表示这两个括号匹配。
  2. 处理不匹配的括号

    • 如果遇到一个右括号 ) 时栈为空,这意味着当前的右括号没有与之匹配的左括号,因此需要插入一个左括号。
    • 如果遍历完字符串后栈中还有未匹配的左括号,这意味着需要插入相应数量的右括号来匹配这些左括号。

解答思路

  1. 有效括号字符串的判断

    • 使用栈来判断括号是否匹配。遍历字符串,遇到左括号 ( 时入栈,遇到右括号 ) 时出栈。如果栈为空且遇到右括号,则说明需要插入一个左括号。
    • 最后,栈中剩余的左括号数量就是需要插入的右括号的数量。
  2. 计算最少插入次数

    • 遍历字符串,使用栈来记录未匹配的左括号。
    • 如果遇到右括号且栈为空,则需要插入一个左括号。
    • 最后,栈中剩余的左括号数量就是需要插入的右括号的数量。

代码如下

#include <iostream>
#include <string>
#include <stack> // 堆栈
using namespace std;
int solution(const std::string& s) {
    stack<char> stack;
    int count = 0;

    for(char ch: s){
        if (ch == '(') { // 左括号入栈
            stack.push(ch);
        }else if (ch == ')') {
            if (!stack.empty()) {
                stack.pop(); //右括号且栈不为空时出栈
            }else {
                count++; // 否则需要一个左括号
            }
        }
    }
    // 栈中剩余的左括号数量就是需要插入的右括号的数量
    count += stack.size();
    return count; 
}

至此问题解决