# Stack# String# Greedy

b838 - 104北二2.括號問題

🔗 前往 ZeroJudge 原題

題目描述

題目要求判斷輸入字串中的括號是否成對且符合先左後右的順序。如果括號正確配對,則輸出括號的數量;否則輸出 0。輸入字串只包含括號,沒有其他字符。

解題思路

程式碼直接遍歷字串,統計左括號和右括號的數量。如果左右括號數量不相等,則判斷為錯誤,輸出 0。如果數量相等,則使用貪婪演算法嘗試配對括號。程式碼使用一個迴圈,尋找未配對的左括號,然後尋找對應的右括號。如果找到配對的括號,則將它們標記為已配對(替換為 '0'),並增加配對的括號數量。如果在尋找右括號的過程中遇到字串結尾,則判斷為錯誤,輸出 0。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(){
	string a;
	getline(cin,a);
	
	while(getline(cin,a)){
		int l=0,r=0,k=0,ans;
		bool c=1;
		for(int i=0;i<a.length();i++){
			if(a[i]=='('){
				l++;
			}
			else if(a[i]==')'){
				r++;
			}
		}
		for(int i=0;i<a.length();i++){
			while(a[i]=='('){
				k=i;
				a[i]='0';
				while(a[i]!=')'){
					i++;
					if(i>a.length()){
						c=0;
						break;
					}
				}
				a[i]='0';
				i=k;
				ans++;
			}
		}
		if(l!=r||c==0){
			ans=0;
		}
		cout << ans << endl;
		ans=0;
	}
}

Discussion