力扣打卡第九天 神奇字符串

神奇字符串

双指针
首先题目给出神奇字符串 sss 的定义:
仅由 111 和 222 组成。
串联字符串中 111 和 222 的连续出现的次数可以生成该字符串。
并给出了字符串 sss 的前几个元素:1221121221221121122…1221121221221121122。现在要求求出 sss 的前 nnn 个数字中 111 的数目,那么我们可以按照定义来构造长度为 nnn 的字符串 sss,然后统计 sss 中 111 的个数即可。那么如何通过现有的开头字符串来构造剩下的字符串呢——我们可以初始化字符串 s=122s = 122s=122,用指针 iii 来指向现在需要构造的对应的组的大小,用指针 jjj 来指向现在需要构造的对应组的位置,此时 i=2i = 2i=2,j=3j = 3j=3。因为相邻组中的数字一定不会相同,所以我们可以通过 jjj 的前一个位置的数来判断当前需要填入的组中的数字。又因为每组的大小只为 111 或者 222,这保证了 j>ij > ij>i 在构造的过程中一定成立,即在指针 jjj 处填入组时一定能确定此时需要填入的组的大小。这样我们就可以不断往下进行构造直到字符串长度到达 nnn。

上述的过程中我们初始化字符串 s=122s = 122s=122,所以当 n<4n < 4n<4 时我们无需再往下构造,此时直接返回 111 即可。

class Solution:
    def magicalString(self, n: int) -> int:
        if n < 4:
            return 1
        s = [''] * n
        s[:3] = "122"
        res = 1
        i, j = 2, 3
        while j < n:
            size = int(s[i])
            num = 3 - int(s[j - 1])
            while size and j < n:
                s[j] = str(num)
                if num == 1:
                    res += 1
                j += 1
                size -= 1
            i += 1
        return res

猜你喜欢

转载自blog.csdn.net/qq_46157589/article/details/127607662