NYOJ 15 括号匹配(二)
描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100 输出 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { ifstream cin("data.txt"); int n; cin >> n; int i,j; string s; string line; int ind; size_t pos; for (i=0;i<n;i++) { cin >> line; s = ""; // 记录未匹配的符号 ind = 0; // 匹配s现有字符串需要的符号个数 for (j=0;j<(int)line.size();j++) { if (line[j]=='(' || line[j]=='[') // 读到(或者[,直接添加给s { s.append(1,line[j]); } else if (line[j]==')') // 如果读到) { if (s.empty()) // s为空,需要添加1个符号,个数加1 { ind++; } else if (*(s.rbegin())!='(') // s不为空,但是最后一个不是( { pos = s.find_last_of("("); // 寻找s中最后一个( if (pos==string::npos) // 如果没有(,直接将)添加到最后 { s += ")"; } else // 找到( { ind += s.size()-pos-1; // 需要添加的个数是(与)之间的符号个数 s = s.substr(0,pos); // 将s从(处截断,因为个数已经记录 } } else // 不为空,最后一个是(,成对括号,将最后一个(消去 { s = s.substr(0,s.size()-1); } } else if (line[j]==']') // 跟上面判断)一样 { if (s.empty()) { ind++; } else if (*(s.rbegin())!='[') { pos = s.find_last_of("["); if (pos==string::npos) { s += "]"; } else { ind += s.size()-pos-1; s = s.substr(0,pos); } } else { s = s.substr(0,s.size()-1); } } } cout << ind+s.size() << endl; // 输出的结果是当前个数ind加上s的长度 } }
No comments :
Post a Comment