Keshawn_lu's Blog

Leetcode 481. 神奇字符串

字数统计: 423阅读时长: 1 min
2022/10/31 Share

题目简介:

神奇字符串 s 仅由 '1''2' 组成,并需要遵守下面的规则:

  • 神奇字符串 s 的神奇之处在于,串联字符串中 '1''2' 的连续出现次数可以生成该字符串。

s 的前几个元素是 s = "1221121221221121122……" 。如果将 s 中连续的若干 12 进行分组,可以得到 "1 22 11 2 1 22 1 22 11 2 11 22 ......" 。每组中 1 或者 2 的出现次数分别是 "1 2 2 1 1 2 1 2 2 1 2 2 ......" 。上面的出现次数正是 s 自身。

给你一个整数 n ,返回在神奇字符串 s 的前 n 个数字中 1 的数目。

示例 1:

1
2
3
输入:n = 6
输出:3
解释:神奇字符串 s 的前 6 个元素是 “122112”,它包含三个 1,因此返回 3

思路:

双指针,一个指针i依次遍历每个元素,代表后续的count,即需要在末尾添加多少元素;

另一个指针j表示当前最末尾的元素。

为了防止特殊情况加大编程难度,我们将字符串初始化为"122"

count == 1时,s += (s[j] == '1' ? '2' : '1')

count == 2时,s += (s[j] == '1' ? "22" : "11")

代码如下:

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
34
35
36
37
38
39
class Solution {
public:
int magicalString(int n) {

if(n < 4)
return 1;

string s = "122";
int res = 0;

int i = 2;
int j = 2;
int count;
while(s.size() < n){

count = s[i] - '0';

if(count == 1){

s += (s[j] == '1' ? '2' : '1');
j++;
}
else{
s += (s[j] == '1' ? "22" : "11");
j += 2;
}

i++;
}

for(int i = 0; i < n; i++){

if(s[i] == '1')
res++;
}

return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: