题目描述:
神奇字符串 s
仅由 '1'
和 '2'
组成,并需要满足以下条件:
- 字符串
s
是神奇的,因为串联字符串s
中的'1'
和'2'
组成的字符串等于s
本身。 - 对于每个索引
i
(s[0]
的索引视为),
s[i]
表示s
中索引i
的字符应该出现的次数。
给你一个整数 n
,返回在神奇字符串 s
的前 n
个字符中有多少个 '1'
。
示例:
输入:n = 6
输出:3
解释:神奇字符串 s 的前 6 个字符是 “122112”,其中 “1” 出现了 3 次。
解题思路:
- 初始化字符串: 从一个已知的神奇字符串开始,例如
"122"
。这是因为我们可以确定前几个字符的生成规则。 - 构建字符串: 使用两个指针
i
和j
,其中i
指向当前需要生成的字符的位置,j
指向当前用于生成字符的规则的位置。 - 生成字符:
- 根据
s[j]
的值确定接下来要添加多少个字符。 - 如果
s[j]
是'1'
,则添加一个与s[i-1]
不同的字符。 - 如果
s[j]
是'2'
,则添加两个与s[i-1]
不同的字符。
- 根据
- 计数
1
的个数: 在生成字符串的过程中,统计前n
个字符中'1'
的个数。
代码实现:
class Solution:
def magicalString(self, n: int) -> int:
if n == 0:
return 0
if n <= 3:
return 1
# 初始化字符串
s = [1, 2, 2]
i, j = 2, 2
count_1 = 1 # 已经有一个 '1'
while len(s) < n:
if s[j] == 1:
# 添加一个与当前不同的字符
next_char = 3 - s[-1]
s.append(next_char)
if next_char == 1:
count_1 += 1
i += 1
elif s[j] == 2:
# 添加两个与当前不同的字符
next_char = 3 - s[-1]
s.append(next_char)
s.append(next_char)
if next_char == 1:
count_1 += 2
i += 2
j += 1
# 如果生成的字符串长度超过 n,需要修正 count_1
if len(s) > n and s[n] == 1:
count_1 -= 1
return count_1
示例
sol = Solution() print(sol.magicalString(6)) # 输出:3
解释:
- 初始化:
s = [1, 2, 2]
,i = 2
,j = 2
,count_1 = 1
。 - 生成字符串:
s[2] = 2
,添加两个与s[-1]
(即2
)不同的字符,即两个1
,s
变为[1, 2, 2, 1, 1]
,count_1
变为3
。j
增加 1,变为 3。s[3] = 1
,添加一个与s[-1]
(即1
)不同的字符,即一个2
,s
变为[1, 2, 2, 1, 1, 2]
。j
增加 1,变为 4。
- 终止条件: 当
s
的长度达到n
时停止生成。
通过这种方式,我们可以有效地构建神奇字符串并统计前 n
个字符中 '1'
的个数。
发表回复