Khái niệm
Đối với một chuỗi str đã cho có chứa các ký tự ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘ và ‘]’, nhiệm vụ là tìm xem các dấu ngoặc có cân bằng hay không.
Dấu ngoặc nhọn được biểu thị là cân bằng nếu -
-
Chúng tôi đóng các dấu ngoặc mở phải được đóng bằng cùng một loại dấu ngoặc.
-
Một lần nữa, chúng tôi đóng các dấu ngoặc mở theo đúng thứ tự.
Đầu vào - str =“(()) {}”
Đầu ra - Có
Đầu vào - str =“)) (([] [”
Đầu ra - Không
Phương pháp
-
Gán hai biến a và b để theo dõi hai dấu ngoặc được so sánh.
-
Cần duy trì một số đếm có giá trị tăng lên khi gặp dấu ngoặc mở và giảm khi gặp dấu ngoặc đóng.
-
Gán b =a, a =a + 1 và count =count + 1 khi bắt gặp dấu ngoặc mở.
-
Tại thời điểm bắt gặp số lượng giảm dần và so sánh các dấu ngoặc tại i và j,
-
Nếu người ta thấy rằng các dấu ngoặc ở a và b là trùng khớp, thì hãy thay thế ‘#’ trong chuỗi ở vị trí thứ a và b. a được tăng và b giảm cho đến khi gặp giá trị không phải ‘#’ hoặc b ≥ 0.
-
Nếu người ta thấy rằng dấu ngoặc tại a và b không phải là khớp thì trả về false.
-
-
Nếu count! =0 thì trả về false.
Ví dụ
// C++ implementation of the approach
#include <iostream>
using namespace std;
bool helperFunc(int& count1, string& s1, int& i1, int& j1, char tocom1){
count1--;
if (j1 > -1 && s1[j1] == tocom1) {
s1[i1] = '#';
s1[j1] = '#';
while (j1 >= 0 && s1[j1] == '#')
j1--;
i1++;
return 1;
}
else
return 0;
}
bool isValid(string s1){
if (s1.length() == 0)
return true;
else {
int i1 = 0;
int count1 = 0;
int j1 = -1;
bool result1;
while (i1 < s1.length()) {
switch (s1[i1]) {
case '}':
result1 = helperFunc(count1, s1, i1, j1, '{');
if (result1 == 0) {
return false;
}
break;
case ')':
result1 = helperFunc(count1, s1, i1, j1, '(');
if (result1 == 0) {
return false;
}
break;
case ']':
result1 = helperFunc(count1, s1, i1, j1, '[');
if (result1 == 0) {
return false;
}
break;
default:
j1 = i1;
i1++;
count1++;
}
}
if (count1 != 0)
return false;
return true;
}
}
// Driver code
int main(){
string str1 = "[[]][]()";
if (isValid(str1))
cout << "Yes";
else
cout << "No";
return 0;
} Đầu ra
Yes