LeetCode Magical String

Description

A magical string S 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 elements 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 ……

You can see that the occurrence sequence above is the S itself.

Given an integer N as input, return the number of ‘1’s in the first N number in the magical string S.

Note: N will not exceed 100,000.

Example 1:

1
2
3
Input: 6
Output: 3
Explanation: The first 6 elements of magical string S is "12211" and it contains three 1's, so return 3.

The original problem is here.

My Solution

I solve this problem in C++, as below:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
int magicalString(int n) {
if(n == 0)
return 0;
if(n <= 3){
return 1;
}
vector<int> str;
str.push_back(1);
str.push_back(2);
str.push_back(2);
int res=1;
int char12 = 1;
int count, j=2;
for(int i=3; i<n;i++) {
count = str[j];
for(int k=0; k<count; k++){
if (char12 == 1) {
str.push_back(1);
res++;
} else {
str.push_back(2);
}
if(str.size() == n)
return res;
}
char12 = 1 - char12;
j++;
}
return res;
}
};

Note

To solve the problem, save the history number and according to the history number to generate new number.