Kiểm tra dãy ngoặc đúng

e nộp code e lên thì toàn bị quá thời gian nhưng e không biết code e chưa tối ưu ở đâu,các a xem giúp e:

#include <bits/stdc++.h>
using namespace std;

bool check(string str) {
	stack<char> s;
	for(int i=0; i<str.length(); i++) {
		char c = str[i];
		if(c == '(' || c == '{' || c == '[') s.push(c);
		else {
			if(!s.empty() && c == ']' && s.top() == '[')  
			    s.pop();
			else if(!s.empty() && c == '}' && s.top() == '{')  
			    s.pop();
			else if(!s.empty() && c == ')' && s.top() == '(')
			    s.pop();
			else return 0;
		}
	}
	return 1;
}
int main() {
	int t; cin >> t;
	while(t--) {
		string str; cin >> str;
		if(check(str)) cout << "yes" << endl;
		else cout << "no" << endl;
	}
	return 0;
}

Code này bạn copy trên mạng à?
Cái input trong code với cái input của bài SPOJ kia có giống nhau đâu ta?

2 Likes

e tìm link bài này để sub nhưng tìm hoài không ra,chỉ tìm được bài kia tương tự,e sub thử thì quá thời gian nên e nghĩ chắc 2 bài là 1 kiểu ,

2 Likes

Với link gốc đề bài trên SPOJ thì người ta không có số lượng testcase ngay dòng đầu tiên. Thì bạn cho mình hỏi dòng int t; cin >> t; của bạn sẽ có t bằng bao nhiêu đây?
Nên mình mới bảo input không giống nhau mà cứ lại không tin.

Còn nếu muốn tối ưu bài này ấy, thì không cần đến stack làm gì đâu, dùng 3 biến đếm số lượng dấu ngoặc là đủ rồi bạn, tiết kiệm được 1 mớ lệnh thừa rồi đấy.
PS: cách này sai, xem comment #7 của bạn @rogp10 bên dưới nhé.

2 Likes

Làm như bạn thì dãy ngoặc này sẽ ra hợp lệ :smiley:

[{(}])

À mà nên bỏ endl luôn, chỉ cần '\n' thôi vì endl là nó flush bộ đệm sẽ mất thời gian.


N = \{S\}, \Sigma = \{ "(",\ ")",\ "[",\ "]",\ "\{",\ "\}"\ \} \\ S \rightarrow (S)\ |\ [S]\ |\ \{S\}\ |\ ""\ |\ SS
6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?