Magical String,LeetCode,481

题目描述:

神奇字符串 s 仅由 '1''2' 组成,并需要满足以下条件:

  1. 字符串 s 是神奇的,因为串联字符串 s 中的 '1''2' 组成的字符串等于 s 本身。
  2. 对于每个索引 is[0] 的索引视为 ),s[i] 表示 s 中索引 i 的字符应该出现的次数。

给你一个整数 n,返回在神奇字符串 s 的前 n 个字符中有多少个 '1'

示例:

输入:n = 6 输出:3 解释:神奇字符串 s 的前 6 个字符是 “122112”,其中 “1” 出现了 3 次。

解题思路:

  1. 初始化字符串: 从一个已知的神奇字符串开始,例如 "122"。这是因为我们可以确定前几个字符的生成规则。
  2. 构建字符串: 使用两个指针 ij,其中 i 指向当前需要生成的字符的位置,j 指向当前用于生成字符的规则的位置。
  3. 生成字符:
    • 根据 s[j] 的值确定接下来要添加多少个字符。
    • 如果 s[j]'1',则添加一个与 s[i-1] 不同的字符。
    • 如果 s[j]'2',则添加两个与 s[i-1] 不同的字符。
  4. 计数 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

解释:

  1. 初始化: s = [1, 2, 2]i = 2j = 2count_1 = 1
  2. 生成字符串:
    • s[2] = 2,添加两个与 s[-1](即 2)不同的字符,即两个 1s 变为 [1, 2, 2, 1, 1]count_1 变为 3
    • j 增加 1,变为 3。
    • s[3] = 1,添加一个与 s[-1](即 1)不同的字符,即一个 2s 变为 [1, 2, 2, 1, 1, 2]
    • j 增加 1,变为 4。
  3. 终止条件:s 的长度达到 n 时停止生成。

通过这种方式,我们可以有效地构建神奇字符串并统计前 n 个字符中 '1' 的个数。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注