
- C++ Basics
- C++ Home
- C++ Overview
- C++ Environment Setup
- C++ Basic Syntax
- C++ Comments
- C++ Data Types
- C++ Variable Types
- C++ Variable Scope
- C++ Constants/Literals
- C++ Modifier Types
- C++ Storage Classes
- C++ Operators
- C++ Loop Types
- C++ Decision Making
- C++ Functions
- C++ Numbers
- C++ Arrays
- C++ Strings
- C++ Pointers
- C++ References
- C++ Date & Time
- C++ Basic Input/Output
- C++ Data Structures
- C++ Object Oriented
- C++ Classes & Objects
- C++ Inheritance
- C++ Overloading
- C++ Polymorphism
- C++ Abstraction
- C++ Encapsulation
- C++ Interfaces
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
- for i in range 0 to arr[head] – 1
- return ret
Let us see the following implementation to get better understanding −
Example
#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
- Related Articles
- Magical String: Question in JavaScript
- Find number of magical pairs of string of length L in C++.
- Nth Magical Number in C++
- Which herb is called a magical herb and why?
- Equals(String, String) Method in C#
- Hyphen string to camelCase string in JavaScript
- String Literal Vs String Object in C#
- String Transforms Into Another String in Python
- Insert a String into another String in Java
- String slicing in C# to rotate a string
- String slicing in Python to rotate a string
- Check if string contains another string in Swift
- Interchanging a string to a binary string in JavaScript
- What are string and String data types in C#?
- Difference between String buffer and String builder in Java

Advertisements