Leetcode 3031. Minimum Time to Revert Word to Initial State II

1. 解题思路

这一题就是一个z算法的题目,算是比较套路的题目了。

关于z算法,之前我们已经写过一个博客(经典算法:Z算法(z algorithm))对这个经典算法本身进行了一下介绍,这里就不展开了,有兴趣的读者可以自行跳转去看一下,或者网上随便其他找一个介绍文章也可以,挺常见的一个算法了。

因此,我们就只看一下z算法是如何应用到这道题目就行了。显然,由于每次移除前k个字符,然后再最后补充k个字符,因此,如果存在某次移除k个字符之后,剩余的子串与原始字符串的开头部分完全一致,那么,我们只需要在后续进行余留的字符补充即可。

而如果知道删除完一轮都无法找到任何字符它的后续子串恰好为原始字符串开头的部分,那么我们也没有关系,总可以删完重排的。

因此,我们要做的就是求取每一个位置的后续子串与原始子串的最长公共头部序列,而这就是z算法要做的事情。

综上,我们先调用一次z算法之后用一个while循环遍历一边即可得到最终答案。

2. 代码实现

给出python代码实现如下:

def z_algorithm(s):
    n = len(s)
    z = [0 for _ in range(n)]
    l, r = -1, -1
    for i in range(1, n):
        if i > r:
            l, r = i, i
            while r < n and s[r-l] == s[r]:
                r += 1
            z[i] = r-l
            r -= 1
        else:
            k = i - l
            if z[k] < r - i + 1:
                z[i] = z[k]
            else:
                l = i
                while r < n and s[r-l] == s[r]:
                    r += 1
                z[i] = r-l
                r -= 1
    z[0] = n
    return z

class Solution:
    def minimumTimeToInitialState(self, word: str, k: int) -> int:
        z = z_algorithm(word)
        ans, idx, n = 0, 0, len(word)
        while True:
            idx += k
            ans += 1
            if idx >= n or z[idx] == n-idx:
                break
        return ans

提交代码评测得到:耗时538ms,占用内存21.2MB。

相关推荐

  1. Leetcode 3033. Modify the Matrix

    2024-02-05 06:04:06       58 阅读
  2. leetcode303--区域和检索

    2024-02-05 06:04:06       41 阅读
  3. Leetcode 3035. Maximum Palindromes After Operations

    2024-02-05 06:04:06       57 阅读
  4. leetcode 303 前缀和 区域和检索

    2024-02-05 06:04:06       36 阅读
  5. Leetcode 3031. Minimum Time to Revert Word to Initial State II

    2024-02-05 06:04:06       50 阅读
  6. Leetcode 3011. Find if Array Can Be Sorted

    2024-02-05 06:04:06       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 06:04:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 06:04:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 06:04:06       87 阅读
  4. Python语言-面向对象

    2024-02-05 06:04:06       96 阅读

热门阅读

  1. JUnit5单元测试框架提供的注解

    2024-02-05 06:04:06       82 阅读
  2. 基础算法bfs -剪枝问题

    2024-02-05 06:04:06       49 阅读
  3. WPF DispatcherTimer用法

    2024-02-05 06:04:06       52 阅读
  4. 常用的正则表达式

    2024-02-05 06:04:06       52 阅读
  5. 力扣:17. 电话号码的字母组合

    2024-02-05 06:04:06       52 阅读
  6. Vivado Tri-MAC IP端口说明

    2024-02-05 06:04:06       60 阅读
  7. Objective-C中的“description“方法

    2024-02-05 06:04:06       50 阅读
  8. Objective-C 中的SEL

    2024-02-05 06:04:06       45 阅读