给定一个只包含小括号的序列,它们有的是匹配的,有的不匹配。请你在这个序列中加入若干个左括号或右括号后使之匹配,并让添加后的序列长度尽可能短。c++代码
时间: 2024-05-04 08:18:27 浏览: 144
数据结构的括号匹配问题.docx
以下是一种基于栈的解法,时间复杂度为O(n)。
```c++
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string s; // 输入的序列
cin >> s;
stack<char> stk; // 用栈来模拟匹配过程
int cnt_l = 0, cnt_r = 0; // 统计需要添加的左右括号数量
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
stk.push(s[i]);
} else if (s[i] == ')') {
if (stk.empty()) { // 如果栈为空,则需要添加一个左括号
cnt_l++;
} else {
stk.pop(); // 如果栈不为空,则匹配成功,弹出栈顶元素
}
}
}
cnt_r = stk.size(); // 最终栈中剩余的元素即为需要添加的右括号数量
cout << cnt_l + cnt_r << endl; // 输出需要添加的括号数量
return 0;
}
```
注意,该算法只能保证添加的括号数量最少,但并不能保证添加后的序列一定是合法的括号序列。比如,对于输入字符串 `"()))))("` ,无论添加多少个左右括号,都无法变成合法的括号序列。因此,在实际应用中,需要进一步判断添加后的序列是否合法。
阅读全文