Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Đếm cặp chuỗi ngoặc sao cho chuỗi kết hợp cân bằng trong C++


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_map um_1 lưu tần suất first (khi last==0), um_2 lưu last (khi first==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ổng min(um_1[k], um_2[k]) cho mọi k.

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