3 Aug 2012

NYOJ 15 括号匹配(二)



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