スタック暴力

トレーニング5 - Eのタイトル

あなたは、文字列sは、4種類<の開閉ブラケットから構成与えられ>、{}、[]、()。開閉:ブラケットの2種類があります。あなたは、同じタイプの別によって任意のブラケットを交換することができます。たとえば、<ブラケット{で、しかし、あなたは)またはそれを置き換えることはできません>置き換えることができます。
あなたはそれに精通していることができますので、通常のブラケットシーケンスの次の定義は、よく知られています。
のは、通常のブラケットシーケンス(RBS)を定義してみましょう。空の文字列はRBSあります。S1およびS2 RBSこと次に文字列がS2、{S1} S2、[S1] S2(S1)S2もRBSありましょう。
例えば、文字列「[[(){} <>」RBSが、ストリング「[)()」と「] [()()」ではありません。
文字列s RBSを作るために置き換えの最小数を決定します。

入力

唯一のラインはわずか4種類のブラケットを開閉なる非空の文字列sを含んでいます。Sの長さは106を超えません。

出力

それはsからRBSを取得することは不可能です場合インポッシブル印刷します。
そうでなければsからRBSを取得するために必要な置き換えの少なくとも数を印刷します。

入力

[<})} {

出力

2

入力

{()} []

出力

0

入力

]]

出力

不可能な

#pragma warning (disable:4996)
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define inf 0X3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N = 1e7 + 5;
const int maxn = 1e3 + 5;

stack<char> s;

int main()
{
	string str;
	cin >> str;
	int ans = 0;
	bool flag = 1;
	for (int i = 0; i < str.size(); i++)
	{
		if (i == 0 || str[i] == '<' || str[i] == '{' || str[i] == '[' || str[i] == '(')
			s.push(str[i]);
		else
		{
			if (s.empty())
			{
				flag = 0;
				break;
			}
			if (str[i] == '>')
			{
				if (s.top() == '<')
					s.pop();
				else if (s.top() == '{' || s.top() == '[' || s.top() == '(')
				{
					ans++;
					s.pop();
				}
				else
				{
					flag = 0;
					break;
				}
			}
			if (str[i] == '}')
			{
				if (s.top() == '{')
					s.pop();
				else if (s.top() == '<' || s.top() == '[' || s.top() == '(')
				{
					ans++;
					s.pop();
				}
				else
				{
					flag = 0;
					break;
				}
			}
			if (str[i] == ']')
			{
				if (s.top() == '[')
					s.pop();
				else if (s.top() == '{' || s.top() == '<' || s.top() == '(')
				{
					ans++;
					s.pop();
				}
				else
				{
					flag = 0;
					break;
				}
			}
			if (str[i] == ')')
			{
				if (s.top() == '(')
					s.pop();
				else if (s.top() == '{' || s.top() == '[' || s.top() == '<')
				{
					ans++;
					s.pop();
				}
				else
				{
					flag = 0;
					break;
				}
			}
		}
	}
	if (s.size())
		flag = 0;
	if (flag)
		printf("%d\n", ans);
	else
		printf("Impossible\n");
	return 0;
}
				

アイデア:
スタックストレージ文字は、スタックから左括弧、右括弧を押してください。

公開された28元の記事 ウォンの賞賛0 ビュー318

おすすめ

転載: blog.csdn.net/xukeke12138/article/details/104825392