完成括號匹配-百度2018秋
1.題目描述
合法的括號匹配序列被定義爲:
- 空串
""
是合法的括號序列 - 如果
"X"
和"Y"
是合法的序列,那麼"XY"
也是一個合法的括號序列 - 如果
"X"
是一個合法的序列,那麼"[X]"
也是一個合法的括號序列 - 每個合法的括號序列都可以由上面的規則生成
例如""
, "[]"
, "[][][]"
, "[[][]]"
, "[[[[]]]]"
都是合法的。
牛牛現在給出一個括號序列s
,牛牛允許你執行的操作是:在s
的開始和結尾處添加一定數量的左括號('['
)或者右括號(']'
)使其變爲一個合法的括號匹配序列。牛牛希望你能求出添加最少的括號之後的合法的括號匹配序列是什麼。
- 輸入描述:
輸入包括一個字符串s
,s
的長度length
(1 ≤length
≤ 50),s
中只包含'['
和']'
。 - 輸出描述:
輸出一個字符串,表示括號完全匹配的序列。 - 輸入示例:
][
- 輸入示例:
[][]
2.題目解析
括弧匹配問題
3.參考答案
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin >> s;
int right = 0;// 記錄多餘[數目
vector<char> stack;
for(int i=0;i<s.size();++i){
if(s[i] == '['){
stack.push_back('[');
}else if(s[i] == ']'){
if(stack.empty()){// 如果前面沒有做左括號,不匹配
++right;
}else{
stack.pop_back();
}
}
}
int left = stack.size();
string res = string(right,'[') + s + string(left,']') ;
cout << res << "\n";
}
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
stack<char> stack;
int left = 0;
int right = 0;
for(int i = 0; i != s.size(); ++i) {
if(s[i] == '[') {
stack.push('[');
} else {
if(stack.empty()){
++left;
} else {
stack.pop();
}
}
}
while(!stack.empty()){
++right;
stack.pop();
}
cout << string(left, '[') + s + string(right, ']') << endl;
return 0;
}
使用vector代替堆棧
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
vector<char> vec;
int left = 0;
for(int i = 0; i != s.size(); ++i) {
if(s[i] == '[') {
vec.push_back('[');
} else {
if(vec.empty()){
++left;
} else {
vec.pop_back();
}
}
}
int right = vec.size();
cout << string(left, '[') + s + string(right, ']') << endl;
return 0;
}
使用計數代替堆棧
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
stack<char> stack;
int left = 0;
int right = 0;
for(int i = 0; i != s.size(); ++i) {
if(s[i] == '[') {
++right;
} else {
if(0 == right){
++left;
} else {
--right;
}
}
}
cout << string(left, '[') + s + string(right, ']') << endl;
return 0;
}