📌  相关文章
📜  连续0和1相等的子字符串计数

📅  最后修改于: 2021-05-05 01:23:15             🧑  作者: Mango

给定二进制字符串str仅为01 。任务是计算字符串str的子字符串总数,以使每个子字符串中的连续01相等。

例子

方法:

  • 从字符串开始算起连续的0(或1)数。
  • 然后从字符串str中0(或1)的计数结束的位置开始计数连续的1(或0)的数目。
  • 具有连续0和1的子字符串的总数是在上述两个步骤中找到的连续0和1的计数的最小值。
  • 重复上述步骤,直到字符串str结束。

下面是上述方法的实现:

C++
// C++ implementation of the
// above approach
#include 
using namespace std;
  
// Function to find the count
// of substrings with equal no.
// of consecutive 0's and 1's
int countSubstring(string& S, int& n)
{
    // To store the total count
    // of substrings
    int ans = 0;
  
    int i = 0;
  
    // Traversing the string
    while (i < n) {
  
        // Count of consecutive
        // 0's & 1's
        int cnt0 = 0, cnt1 = 0;
  
        // Counting subarrays of
        // type "01"
        if (S[i] == '0') {
  
            // Count the consecutive
            // 0's
            while (i < n && S[i] == '0') {
                cnt0++;
                i++;
            }
  
            // If consecutive 0's
            // ends then check for
            // consecutive 1's
            int j = i;
  
            // Counting consecutive 1's
            while (j < n && S[j] == '1') {
                cnt1++;
                j++;
            }
        }
  
        // Counting subarrays of
        // type "10"
        else {
  
            // Count consecutive 1's
            while (i < n && S[i] == '1') {
                cnt1++;
                i++;
            }
  
            // If consecutive 1's
            // ends then check for
            // consecutive 0's
            int j = i;
  
            // Count consecutive 0's
            while (j < n && S[j] == '0') {
                cnt0++;
                j++;
            }
        }
  
        // Update the total count
        // of substrings with
        // minimum of (cnt0, cnt1)
        ans += min(cnt0, cnt1);
    }
  
    // Return answer
    return ans;
}
  
// Driver code
int main()
{
    string S = "0001110010";
    int n = S.length();
  
    // Function to print the
    // count of substrings
    cout << countSubstring(S, n);
    return 0;
}


Java
// Java implementation of the 
// above approach 
class GFG{
  
    // Function to find the count 
    // of substrings with equal no. 
    // of consecutive 0's and 1's 
    static int countSubstring(String S, int n) 
    { 
        // To store the total count 
        // of substrings 
        int ans = 0; 
      
        int i = 0; 
      
        // Traversing the string 
        while (i < n) { 
      
            // Count of consecutive 
            // 0's & 1's 
            int cnt0 = 0, cnt1 = 0; 
      
            // Counting subarrays of 
            // type "01" 
            if (S.charAt(i) == '0') { 
      
                // Count the consecutive 
                // 0's 
                while (i < n && S.charAt(i) == '0') { 
                    cnt0++; 
                    i++; 
                } 
      
                // If consecutive 0's 
                // ends then check for 
                // consecutive 1's 
                int j = i; 
      
                // Counting consecutive 1's 
                while (j < n && S.charAt(j) == '1') { 
                    cnt1++; 
                    j++; 
                } 
            } 
      
            // Counting subarrays of 
            // type "10" 
            else { 
      
                // Count consecutive 1's 
                while (i < n && S.charAt(i) == '1') { 
                    cnt1++; 
                    i++; 
                } 
      
                // If consecutive 1's 
                // ends then check for 
                // consecutive 0's 
                int j = i; 
      
                // Count consecutive 0's 
                while (j < n && S.charAt(j) == '0') { 
                    cnt0++; 
                    j++; 
                } 
            } 
      
            // Update the total count 
            // of substrings with 
            // minimum of (cnt0, cnt1) 
            ans += Math.min(cnt0, cnt1); 
        } 
      
        // Return answer 
        return ans; 
    } 
      
    // Driver code 
    static public void main(String args[])
    { 
        String S = "0001110010"; 
        int n = S.length(); 
      
        // Function to print the 
        // count of substrings 
        System.out.println(countSubstring(S, n)); 
    } 
}
  
// This code is contributed by Yash_R


Python3
# Python3 implementation of the
# above approach
  
# Function to find the count
# of substrings with equal no.
# of consecutive 0's and 1's
def countSubstring(S, n) :
  
    # To store the total count
    # of substrings
    ans = 0;
  
    i = 0;
  
    # Traversing the string
    while (i < n) :
  
        # Count of consecutive
        # 0's & 1's
        cnt0 = 0; cnt1 = 0;
  
        # Counting subarrays of
        # type "01"
        if (S[i] == '0') :
  
            # Count the consecutive
            # 0's
            while (i < n and S[i] == '0') :
                cnt0 += 1;
                i += 1;
  
            # If consecutive 0's
            # ends then check for
            # consecutive 1's
            j = i;
  
            # Counting consecutive 1's
            while (j < n and S[j] == '1') :
                cnt1 += 1;
                j += 1;
  
        # Counting subarrays of
        # type "10"
        else :
  
            # Count consecutive 1's
            while (i < n and S[i] == '1') :
                cnt1 += 1;
                i += 1;
  
            # If consecutive 1's
            # ends then check for
            # consecutive 0's
            j = i;
  
            # Count consecutive 0's
            while (j < n and S[j] == '0') :
                cnt0 += 1;
                j += 1;
  
        # Update the total count
        # of substrings with
        # minimum of (cnt0, cnt1)
        ans += min(cnt0, cnt1);
  
    # Return answer
    return ans;
  
# Driver code
if __name__ == "__main__" :
    S = "0001110010";
    n = len(S);
  
    # Function to print the
    # count of substrings
    print(countSubstring(S, n));
      
# This code is contributed by Yash_R


C#
// C# implementation of the 
// above approach 
using System;
  
class GFG{
  
    // Function to find the count 
    // of substrings with equal no. 
    // of consecutive 0's and 1's 
    static int countSubstring(string S, int n) 
    { 
        // To store the total count 
        // of substrings 
        int ans = 0; 
      
        int i = 0; 
      
        // Traversing the string 
        while (i < n) { 
      
            // Count of consecutive 
            // 0's & 1's 
            int cnt0 = 0, cnt1 = 0; 
      
            // Counting subarrays of 
            // type "01" 
            if (S[i] == '0') { 
      
                // Count the consecutive 
                // 0's 
                while (i < n && S[i] == '0') { 
                    cnt0++; 
                    i++; 
                } 
      
                // If consecutive 0's 
                // ends then check for 
                // consecutive 1's 
                int j = i; 
      
                // Counting consecutive 1's 
                while (j < n && S[j] == '1') { 
                    cnt1++; 
                    j++; 
                } 
            } 
      
            // Counting subarrays of 
            // type "10" 
            else { 
      
                // Count consecutive 1's 
                while (i < n && S[i] == '1') { 
                    cnt1++; 
                    i++; 
                } 
      
                // If consecutive 1's 
                // ends then check for 
                // consecutive 0's 
                int j = i; 
      
                // Count consecutive 0's 
                while (j < n && S[j] == '0') { 
                    cnt0++; 
                    j++; 
                } 
            } 
      
            // Update the total count 
            // of substrings with 
            // minimum of (cnt0, cnt1) 
            ans += Math.Min(cnt0, cnt1); 
        } 
      
        // Return answer 
        return ans; 
    } 
      
    // Driver code 
    static public void Main ()
    { 
        string S = "0001110010"; 
        int n = S.Length; 
      
        // Function to print the 
        // count of substrings 
        Console.WriteLine(countSubstring(S, n)); 
    } 
}
  
// This code is contributed by Yash_R


输出:
7

时间复杂度: O(N),其中N =字符串的长度。