📜  平衡括号子串的数量

📅  最后修改于: 2021-04-27 09:42:32             🧑  作者: Mango

给定一个由’ ( ‘和’ ) ‘组成的平衡括号字符串。任务是找到给定字符串中平衡括号子字符串

例子 :

方法 :
让我们假设,每当遇到开括号时,深度增加一,而当开括号时,深度减少一。每当我们遇到右方括号时,将所需的答案增加一个,然后再在此深度处将已经形成的平衡子字符串增加所需的答案。

下面是上述方法的实现:

C++
// CPP program to find number of
// balanced parenthesis sub strings
#include 
using namespace std;
  
// Function to find number of
// balanced parenthesis sub strings
int Balanced_Substring(string str, int n)
{
    // To store required answer
    int ans = 0;
  
    // Vector to stores the number of
    // balanced brackets at each depth.
    vector arr(n / 2 + 1, 0);
  
    // d strores checks the depth of our sequence
    // For example level of () is 1
    // and that of (()) is 2.
    int d = 0;
    for (int i = 0; i < n; i++) {
        // If open bracket
        // increase depth
        if (str[i] == '(')
            d++;
  
        // If closing bracket
        else {
            if (d == 1) {
                for (int j = 2; j <= n / 2 + 1 && arr[j] != 0; j++)
                    arr[j] = 0;
            }
            ++ans;
            ans += arr[d];
            arr[d]++;
            d--;
        }
    }
  
    // Return the required answer
    return ans;
}
  
// Driver code
int main()
{
    string str = "()()()";
  
    int n = str.size();
  
    // Function call
    cout << Balanced_Substring(str, n);
  
    return 0;
}


Java
// Java program to find number of
// balanced parenthesis sub strings
class GFG {
  
    // Function to find number of
    // balanced parenthesis sub strings
    public static int Balanced_Substring(String str,
                                         int n)
    {
  
        // To store required answer
        int ans = 0;
  
        // Vector to stores the number of
        // balanced brackets at each depth.
        int[] arr = new int[n / 2 + 1];
  
        // d strores checks the depth of our sequence
        // For example level of () is 1
        // and that of (()) is 2.
        int d = 0;
        for (int i = 0; i < n; i++) {
  
            // If open bracket
            // increase depth
            if (str.charAt(i) == '(')
                d++;
  
            // If closing bracket
            else {
                if (d == 1) {
                    for (int j = 2; j <= n / 2 + 1 && arr[j] != 0; j++)
                        arr[j] = 0;
                }
                ++ans;
                ans += arr[d];
                arr[d]++;
                d--;
            }
        }
  
        // Return the required answer
        return ans;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        String str = "()()()";
        int n = str.length();
  
        // Function call
        System.out.println(Balanced_Substring(str, n));
    }
}
  
// This code is contributed by
// sanjeev2552


Python3
# Python3 program to find number of 
# balanced parenthesis sub strings 
  
# Function to find number of
# balanced parenthesis sub strings
def Balanced_Substring(s, n):
  
    # To store required answer
    ans = 0;
  
    # Vector to stores the number of
    # balanced brackets at each depth.
    arr = [0] * (int(n / 2) + 1);
  
    # d strores checks the depth of our sequence
    # For example level of () is 1
    # and that of (()) is 2.
    d = 0;
    for i in range(n):
  
        # If open bracket
        # increase depth
        if (s[i] == '('):
            d += 1;
  
        # If closing bracket
        else:
            if (d == 1):
                j = 2
                while (j <= n//2 + 1 and arr[j] != 0):
                    arr[j] = 0
            ans += 1;
            ans += arr[d];
            arr[d] += 1;
            d -= 1;
  
    # Return the required answer
    return ans;
  
# Driver code
s = "()()()";
n = len(s);
  
# Function call
print(Balanced_Substring(s, n));
  
# This code contributed by Rajput-Ji


C#
// C# program to find number of
// balanced parenthesis sub strings
using System;
  
class GFG {
  
    // Function to find number of
    // balanced parenthesis sub strings
    public static int Balanced_Substring(String str,
                                         int n)
    {
  
        // To store required answer
        int ans = 0;
  
        // Vector to stores the number of
        // balanced brackets at each depth.
        int[] arr = new int[n / 2 + 1];
  
        // d strores checks the depth of our sequence
        // For example level of () is 1
        // and that of (()) is 2.
        int d = 0;
        for (int i = 0; i < n; i++) {
  
            // If open bracket
            // increase depth
            if (str[i] == '(')
                d++;
  
            // If closing bracket
            else {
                if (d == 1) {
                    for (int j = 2; j <= n / 2 + 1 && arr[j] != 0; j++)
                        arr[j] = 0;
                }
                ++ans;
                ans += arr[d];
                arr[d]++;
                d--;
            }
        }
  
        // Return the required answer
        return ans;
    }
  
    // Driver code
    public static void Main(String[] args)
    {
        String str = "()()()";
        int n = str.Length;
  
        // Function call
        Console.WriteLine(Balanced_Substring(str, n));
    }
}
  
// This code is contributed by Princi Singh


输出:
6

时间复杂度: O(N)