Open In App

Check if a binary string has two consecutive occurrences of one everywhere

Improve
Improve
Like Article
Like
Save
Share
Report

Given string str consisting of only the characters ‘a’ and ‘b’, the task is to check whether the string is valid or not. In a valid string, every group of consecutive b must be of length 2 and must appear after 1 or more occurrences of character ‘a’ i.e. “abba” is a valid sub-string but “abbb” and aba are not. Print 1 if the string is valid, else print -1.

Examples: 

Input: str = “abbaaabbabba” 
Output: 1

Input: str = “abbaaababb” 
Output: -1 

Approach: Find every occurrence of ‘b’ in the string and check whether it is a part of the sub-string “abb”. If the condition fails for any sub-string, then print -1 else print 1.

Algorithm:

  • Create a method named “isValidString” with boolean return type which takes two values as input string named “str” and integer name “n”.
  • Set the value of the “index” variable to the position of the character “b” that appears in the string “str” the first time.
  • Return false if “index” equals 0.
  • Start a while loop with condition index is less than (n-1).
    •  If “a” is not the character before “b” in “str,” return false.
    • Return false if the character in “str” following “b” is not “b” and the index of the character after “b” falls within the confines of “str’s” length.
    •  Return false if the substring “abb” is located in “str” starting from the index of the character after the next occurrence of the letter “b” and up to two characters after that.
    •  If “b” is the string’s final character, return false.
    •  Change “index” to the index of “b” in “str” at the following instance, beginning from the index of the present instance + 2.
  •  If came out of the while loop returns True.   

    Below is the implementation of the above approach: 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that returns 1 if str is valid
bool isValidString(string str, int n)
{
    // Index of first appearance of 'b'
    int index = find(str.begin(),      
                     str.end(), 'b') -
                     str.begin();
 
    // If str starts with 'b'
    if (index == 0)
        return false;
 
    // While 'b' occurs in str
    while (index <= n - 1)
    {
        // If 'b' doesn't appear after an 'a'
        if (str[index - 1] != 'a')
            return false;
 
        // If 'b' is not succeeded by another 'b'
        if (index + 1 < n && str[index + 1] != 'b')
            return false;
 
        // If sub-string is of the type "abbb"
        if (index + 2 < n && str[index + 2] == 'b')
            return false;
 
        // If str ends with a single b
        if (index == n - 1)
            return false;
 
        index = find(str.begin() + index + 2,
                     str.end(), 'b') - str.begin();
    }
    return true;
}
 
// Driver code
int main()
{
    string str = "abbaaabbabba";
    int n = str.length();
    isValidString(str, n) ? cout
                << "true" : cout << "false";
    return 0;
}
 
// This code is contributed by
// sanjeev2552


Java




// Java implementation of the approach
class GFG {
 
    // Function that returns 1 if str is valid
    private static boolean isValidString(String str, int n)
    {
 
        // Index of first appearance of 'b'
        int index = str.indexOf("b");
 
        // If str starts with 'b'
        if (index == 0)
            return false;
 
        // While 'b' occurs in str
        while (index != -1) {
 
            // If 'b' doesn't appear after an 'a'
            if (str.charAt(index - 1) != 'a')
                return false;
 
            // If 'b' is not succeeded by another 'b'
            if (index + 1 < n && str.charAt(index + 1) != 'b')
                return false;
 
            // If sub-string is of the type "abbb"
            if (index + 2 < n && str.charAt(index + 2) == 'b')
                return false;
 
            // If str ends with a single b
            if (index == n - 1)
                return false;
 
            index = str.indexOf("b", index + 2);
        }
        return true;
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "abbaaabbabba";
        int n = str.length();
        System.out.println(isValidString(str, n));
    }
}


Python 3




# Python 3 implementation of the approach
 
# Function that returns 1 if str is valid
def isValidString(str, n):
 
    # Index of first appearance of 'b'
    idx = str.find("b")
 
    # If str starts with 'b'
    if (idx == 0):
        return False
 
    # While 'b' occurs in str
    while (idx != -1):
 
        # If 'b' doesn't appear after an 'a'
        if (str[idx - 1] != 'a'):
            return False
 
        # If 'b' is not succeeded by another 'b'
        if (idx + 1 < n and str[idx + 1] != 'b'):
            return False
 
        # If sub-string is of the type "abbb"
        if (idx + 2 < n and str[idx + 2] == 'b'):
            return False
 
        # If str ends with a single b
        if (idx == n - 1):
            return False
 
        idx = str.find("b", idx + 2)
 
    return True
 
# Driver code
if __name__ == "__main__":
 
    str = "abbaaabbabba"
    n = len(str)
    print(isValidString(str, n))
 
# This code is contributed by ita_c


C#




// C# implementation of the approach
using System;
 
class GFG
{
 
    // Function that returns 1 if str is valid
    private static bool isValidString(string str, int n)
    {
 
        // Index of first appearance of 'b'
        int index = str.IndexOf("b");
 
        // If str starts with 'b'
        if (index == 0)
            return false;
 
        // While 'b' occurs in str
        while (index != -1)
        {
 
            // If 'b' doesn't appear after an 'a'
            if (str[index - 1] != 'a')
                return false;
 
            // If 'b' is not succeeded by another 'b'
            if (index + 1 < n && str[index + 1] != 'b')
                return false;
 
            // If sub-string is of the type "abbb"
            if (index + 2 < n && str[index + 2] == 'b')
                return false;
 
            // If str ends with a single b
            if (index == n - 1)
                return false;
 
            index = str.IndexOf("b", index + 2);
        }
        return true;
    }
 
    // Driver code
    public static void Main()
    {
        string str = "abbaaabbabba";
        int n = str.Length;
        Console.WriteLine(isValidString(str, n));
    }
}
 
// This code is contributed by Ryuga


Javascript




<script>
// Javascript implementation of the approach
 
// Function that returns 1 if str is valid
function isValidString(str,n)
{
        // Index of first appearance of 'b'
        let index = str.indexOf("b");
   
        // If str starts with 'b'
        if (index == 0)
            return false;
   
        // While 'b' occurs in str
        while (index != -1) {
   
            // If 'b' doesn't appear after an 'a'
            if (str[index - 1] != 'a')
                return false;
   
            // If 'b' is not succeeded by another 'b'
            if (index + 1 < n && str[index + 1] != 'b')
                return false;
   
            // If sub-string is of the type "abbb"
            if (index + 2 < n && str[index + 2] == 'b')
                return false;
   
            // If str ends with a single b
            if (index == n - 1)
                return false;
   
            index = str.indexOf("b", index + 2);
        }
        return true;
}
 
// Driver code
let str = "abbaaabbabba";
let n = str.length;
document.write(isValidString(str, n));
 
// This code is contributed by rag2127
</script>


Output: 

true

 

Time complexity: O(n*n), the find() function takes O(n) time and in the worst case we need to do O(n) find() operations.
Auxiliary space: O(1), As constant extra space is used.



Last Updated : 07 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads