每日一水
先说些题外话,AI刷题也是终于出了C++的代码提交了,对于作者这样只系统学过C语言的同学还是很友好的,终于不用写完代码再让AI转成python或者java语言提交了,也是品上细糠了.好了正片开始
问题描述
小R有一个括号字符串 s,他想知道这个字符串是否是有效的。一个括号字符串如果满足以下条件之一,则是有效的:
- 它是一个空字符串;
- 它可以写成两个有效字符串的连接形式,即
AB; - 它可以写成
(A)的形式,其中A是有效字符串。
在每次操作中,小R可以在字符串的任意位置插入一个括号。你需要帮小R计算出,最少需要插入多少个括号才能使括号字符串 s 有效。
例如:当 s = "())" 时,小R需要插入一个左括号使字符串有效,结果为 1。
提示
该问题可以看出,是一个左括号配上一个右括号才有效,需要我们找出没有配对的括号数.那么就可以用栈的知识来解决, 下面先来简单介绍一下"栈".
栈
-
定义:
- 栈是一种线性数据结构,遵循“后进先出”(Last In, First Out,LIFO)的原则。
- 这意味着最后进入栈的元素会最先被移除。
-
基本操作:
- Push:将元素压入栈顶。
- Pop:从栈顶移除元素。
- Peek/Top:查看栈顶元素,但不移除它。
- IsEmpty:检查栈是否为空。
- Size:获取栈中元素的数量。
由于
-
括号的嵌套特性:
- 括号字符串的有效性通常涉及到嵌套结构,例如
(())或(()())。栈的“后进先出”(LIFO)特性非常适合处理这种嵌套结构。 - 当你遇到一个左括号
(时,你可以将其压入栈中。当你遇到一个右括号)时,你可以从栈顶弹出一个左括号,表示这两个括号匹配。
- 括号字符串的有效性通常涉及到嵌套结构,例如
-
处理不匹配的括号:
- 如果遇到一个右括号
)时栈为空,这意味着当前的右括号没有与之匹配的左括号,因此需要插入一个左括号。 - 如果遍历完字符串后栈中还有未匹配的左括号,这意味着需要插入相应数量的右括号来匹配这些左括号。
- 如果遇到一个右括号
解答思路
-
有效括号字符串的判断:
- 使用栈来判断括号是否匹配。遍历字符串,遇到左括号
(时入栈,遇到右括号)时出栈。如果栈为空且遇到右括号,则说明需要插入一个左括号。 - 最后,栈中剩余的左括号数量就是需要插入的右括号的数量。
- 使用栈来判断括号是否匹配。遍历字符串,遇到左括号
-
计算最少插入次数:
- 遍历字符串,使用栈来记录未匹配的左括号。
- 如果遇到右括号且栈为空,则需要插入一个左括号。
- 最后,栈中剩余的左括号数量就是需要插入的右括号的数量。
代码如下
#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;
}