
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