Cho một mảng chuỗi chứa các ký tự ngoặc. Nhiệm vụ: đếm số cặp chuỗi có thể kết hợp thành một chuỗi ngoặc cân bằng. Chuỗi cân bằng khi số ngoặc mở '(' và ngoặc đóng ')' bằng nhau. Mỗi chuỗi chỉ dùng tối đa một lần.
Ví dụ
Đầu vào − paran[] = {")()())", "(", ")(", ")(", ")"}
Đầu ra − 1
Giải thích − Phần tử 1: ")()())" có 4 ')' và 2 '('. Cần chuỗi có 2 ')' để cân bằng → không có. Cặp hợp lệ tại chỉ số (2,5) → count = 1.
Đầu vào − paran[] = {")()())", "((", "(", ")(", ")(", ")"}
Đầu ra − 2
Giải thích − Các cặp cân bằng: (1,2) và (3,6).
Phương pháp giải
- Duyệt từng chuỗi, đếm số ngoặc mở dư (
first) và ngoặc đóng dư (last). - Dùng
unordered_mapum_1lưu tần suấtfirst(khilast==0),um_2lưulast(khifirst==0). - Nếu
first==0 && last==0→ chuỗi đã cân bằng,count++. - Cuối cùng:
count = count/2(cặp chuỗi cân bằng nhau) + tổngmin(um_1[k], um_2[k])cho mọik.
Ví dụ code
#include <bits/stdc++.h>
using namespace std;
int parentheses(string paran[], int size) {
int count = 0;
unordered_map<int, int> um_1, um_2;
for (int i = 0; i < size; i++) {
string str = paran[i];
int len = str.length();
int first = 0, last = 0;
for (int j = 0; j < len; j++) {
if (str[j] == '(') first++;
else {
if (first == 1) first--;
else last++;
}
}
if (first == 1 && last != 1) um_1[first]++;
if (last == 1 && first != 1) um_2[last]++;
if (first != 1 && last != 1) count++;
}
count = count / 2;
for (auto it : um_1) {
count += min(it.second, um_2[it.first]);
}
return count;
}
int main() {
string paran[] = {")()())", "(", ")(", ")(", ")"};
int size = sizeof(paran) / sizeof(paran[0]);
cout << "Count of pairs of parentheses sequences such that parentheses are balanced are: " << parentheses(paran, size);
}
Đầu ra
Count of pairs of parentheses sequences such that parentheses are balanced are: 1