题目描述:
神奇字符串 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' 的个数。
发表回复