Magical String in C++


Suppose there is a string. That string is called a magical string S, that consists of only '1' and '2' and obeys the following rules −

  • The string S is magical because concatenating the number of contiguous occurrences of characters '1' and '2' generates the string S itself.
  • The first few components of string S is the following − S = "1221121221221121122……"
  • If we group the consecutive '1's and '2's in S, it will be − 1 22 11 2 1 22 1 22 11 2 11 22 ...... and the occurrences of '1's or '2's in each group are − 1 2 2 1 1 2 1 2 2 1 2 2 ......

Now suppose we have an integer N as input, find the number of '1's in the first N number in the magical string S. So if the input is like 6, then the output will be 3, as first 6 elements in the magical string is “12211”. This contains three 1s, so return 3.

To solve this, we will follow these steps −

  • if n <= 0, then return 0, if n <= 3, then return 1
  • ret := 1, make an array arr of size n
  • arr[0] := 1, arr[1] := 2, arr[2] := 2
  • head := 2, tail := 3 and num := 1
  • while tail < n
    • for i in range 0 to arr[head] – 1
      • arr[tail] := num
      • if num is 1 and tail < n, then increase ret by 1
      • increase tail by 1
      • if tail >= n, then break the loop
    • num = num XOR 3
    • increase head by 1
  • return ret

Let us see the following implementation to get better understanding −

Example

 Live Demo

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int magicalString(int n) {
      if(n <= 0) return 0;
      if(n <= 3) return 1;
      int ret = 1;
      vector <int> arr(n);
      arr[0] = 1;
      arr[1] = 2;
      arr[2] = 2;
      int head = 2;
      int tail = 3;
      int num = 1;
      while(tail < n){
         for(int i = 0; i < arr[head]; i++){
            arr[tail] = num;
            if(num == 1 && tail < n) ret++;
            tail++;
            if(tail >= n) break;
         }
         num ^= 3;
         head++;
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.magicalString(6));
}

Input

6

Output

3

Updated on: 02-May-2020

510 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements