20221031 - 481. Magical String 神奇字符串(双指针)

91 阅读1分钟

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 s is 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 is s itself.

Given an integer n, return the number of 1's in the first n number in the magical string s.

Example 1

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

Example 2

Input: n = 1
Output: 1

Constraints

  • 1 <= n <= 1e5

Solution

原字符串与字符串组内出现连续字符次数组成的序列一致。

i 指向由组数构成序列中的当前生成数字的组数,赋给 size 来记录 j 要生成多少个字符

j 指向生成序列的当前元素,根据进入循环前的字符与其不同来确定当前字符 num

class Solution {
public:
    int magicalString(int n) {
        if (n < 4) return 1;
        string s (n, '0');
        s[0] = '1'; s[1] = '2'; s[2] = '2';
        int i, j, ans;
        i = 2; j = 3; ans = 1;
        while (j < n) {
            int size = s[i] - '0';
            int num = 3 - (s[j - 1] - '0');
            while (size > 0 && j < n) {
                s[j] = num + '0';
                if (num == 1) ans++;
                size--;
                j++;
            }
            i++;
        }
        return ans;
    }
};

题目链接:481. 神奇字符串 - 力扣(LeetCode)