# Stack# String# Greedy

e924 - pC. 括號配對

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷輸入字串中的各種括號(圓括號、方括號、小於大於括號、曲括號)是否正確配對。

解題思路

此題可以使用堆疊 (Stack) 的概念來解決。遍歷字串,遇到左括號時,將其推入堆疊;遇到右括號時,檢查堆疊頂部的左括號是否與其匹配。如果匹配,則將左括號從堆疊中彈出;如果不匹配,則判斷配對失敗。最後,如果堆疊為空,則表示所有括號都已正確配對;否則,表示配對失敗。程式碼中 d[0], d[1], d[2], d[3] 分別記錄了 (), {}, <>, [] 的數量,tmp 陣列模擬了堆疊,it 記錄了堆疊的頂端。

複雜度分析

  • 時間複雜度: O(n),其中 n 是字串的長度。因為需要遍歷字串一次。
  • 空間複雜度: O(n),在最壞情況下,如果輸入字串只包含左括號,則堆疊的大小將與字串的長度相同。

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
int main(){
	int n,d[4]={0},it=0,tmp[1001]={0};
	char a;
	while(a=getchar_unlocked())
		if(a=='\n')break;
	bool ans=1;
	while(a=getchar_unlocked()){
		if(a==-1)break;
		if(a=='\n'||a==-1){
			if(d[0]||d[1]||d[2]||d[3])ans=0;
			if(ans){
				putchar_unlocked('Y');
				putchar_unlocked('\n');
			}
			else{
				putchar_unlocked('N');
				putchar_unlocked('\n');
			}
			for(int i=0;i<1001;++i)
				tmp[i]=0;
			ans=1;
			it=0;
			d[0]=0;
			d[1]=0;
			d[2]=0;
			d[3]=0;
		}
		else if(a=='('){
			++d[0];
			tmp[it]=-1;
			++it;
		}
		else if(a=='{'){
			++d[1];
			tmp[it]=1;
			++it;
		}
		else if(a=='<'){
			++d[2];
			tmp[it]=2;
			++it;
		}
		else if(a=='['){
			++d[3];
			tmp[it]=3;
			++it;
		}
		else if(a==')'){
			--it;
			if(!d[0]||it<0||tmp[it]!=-1)
				ans=0;
			tmp[it]=0;
			--d[0];
		}
		else if(a=='}'){
			--it;
			if(!d[1]||it<0||tmp[it]!=1)
				ans=0;
			tmp[it]=0;
			--d[1];
		}
		else if(a=='>'){
			--it;
			if(!d[2]||it<0||tmp[it]!=2)
				ans=0;
			tmp[it]=0;
			--d[2];
		}
		else if(a==']'){
			--it;
			if(!d[3]||it<0||tmp[it]!=3)
				ans=0;
			tmp[it]=0;
			--d[3];
		}
	}
}

Discussion