# 481 Magical String

## 481. [Magical String](https://leetcode.com/problems/magical-string/description/)

## 1. Question

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:**&#x4E; will not exceed 100,000.

**Example 1:**

```
Input: 6

Output: 3

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

## 2. Implementation

**(1) Two Pointers**

思路: 这道题的关键在于找到形成magical string的规律，这里的规律是从"122"中的第3位开始，，该位置上是数字2，先形成2个1，然后到第四位，该位置上是数字1，形成1个2，然后第5位，该位置上是1, 形成1个1，以此类推

```java
class Solution {
    public int magicalString(int n) {
        if (n <= 0) {
            return 0;
        }

        if (n <= 3) {
            return 1;
        }

        int[] sequence = new int[n + 1];
        sequence[0] = 1;
        sequence[1] = 2;
        sequence[2] = 2;
        int head = 2, tail = 3;
        int res = 1;
        int num = 1;

        while (tail < n) {
            for (int i = 0; i < sequence[head]; i++) {
                sequence[tail] = num;
                if (num == 1 && tail < n) {
                    ++res;
                }
                ++tail;
            }
            num ^= 3;
            ++head;
        }
        return res;
    }
}
```

## 3. Time & Space Complexity

**Two Pointers:** 时间复杂度O(n), 空间复杂度O(n)
