2024-07-03:用go语言,给定一个初始字符串 word 和一个整数 k, 我们需要按照以下规则进行操作: 每秒钟执行两个

举报
福大大架构师每日一题 发表于 2024/07/03 21:34:16 2024/07/03
【摘要】 2024-07-03:用go语言,给定一个初始字符串 word 和一个整数 k,我们需要按照以下规则进行操作:每秒钟执行两个操作,即删除word的前k个字符并在末尾添加k个任意字符,直到word恢复到初始状态为止。我们需要计算恢复到初始状态所需的最短时间,该时间必须大于零。输入:word = “abacaba”, k = 3。输出:2。解释:第 1 秒,移除 word 的前缀 “aba”,并...

2024-07-03:用go语言,给定一个初始字符串 word 和一个整数 k,

我们需要按照以下规则进行操作:

每秒钟执行两个操作,即删除word的前k个字符并在末尾添加k个任意字符,直到word恢复到初始状态为止。

我们需要计算恢复到初始状态所需的最短时间,该时间必须大于零。

输入:word = “abacaba”, k = 3。

输出:2。

解释:

第 1 秒,移除 word 的前缀 “aba”,并在末尾添加 “bac” 。因此,word 变为 “cababac”。

第 2 秒,移除 word 的前缀 “cab”,并在末尾添加 “aba” 。因此,word 变为 “abacaba” 并恢复到始状态。

可以证明,2 秒是 word 恢复到其初始状态所需的最短时间。

答案2024-07-03:

chatgpt

题目来自leetcode3029。

大体步骤如下:

1.我们首先定义初始字符串 word 为 “abacaba”,整数 k 为 3。

2.定义函数 minimumTimeToInitialState(s string, k int) int 来计算恢复到初始状态所需的最短时间。

3.在函数内部,我们首先获取字符串 s 的长度 n,并创建一个长度为 n 的整型切片 z 用来存储计算结果。

4.使用循环遍历字符串 s,对每个位置进行处理,维护指针 l 和 r 指示当前处理的子字符串范围。

5.进行 Z-Algorithm 的计算,在内循环中计算以每个位置 i 结尾的最长公共前后缀长度。

6.如果当前位置 i 是步长 k 的倍数且该位置的最长公共前后缀长度 z[i] 大于等于 n-i,说明此时已经恢复到初始状态,返回恢复所需的时间。

7.循环结束后,如果未在合适位置返回恢复时间,则计算总的时间复杂度和额外空间复杂度。

总的时间复杂度为 O(n) 或 O(N+k),其中 N 是字符串的长度,k 是指定的整数。

在空间复杂度上,除了存储输入数据外,额外使用了长度为 n 的整型切片 z,因此总的额外空间复杂度为 O(n)。

Go完整代码如下:

package main

import (
	"fmt"
)

func minimumTimeToInitialState(s string, k int) int {
	n := len(s)
	z := make([]int, n)
	for i, l, r := 1, 0, 0; i < n; i++ {
		if i <= r {
			z[i] = getMin(z[i-l], r-i+1)
		}
		for i+z[i] < n && s[z[i]] == s[i+z[i]] {
			l, r = i, i+z[i]
			z[i]++
		}
		if i%k == 0 && z[i] >= n-i {
			return i / k
		}
	}
	return (n-1)/k + 1
}

func getMin(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}

func main() {
	word := "abacaba"
	k := 3
	fmt.Println(minimumTimeToInitialState(word, k))
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def minimum_time_to_initial_state(s, k):
    n = len(s)
    z = [0] * n
    for i in range(1, n):
        l, r = 0, 0
        if i <= r:
            z[i] = min(z[i - l], r - i + 1)
        while i + z[i] < n and s[z[i]] == s[i + z[i]]:
            l, r = i, i + z[i]
            z[i] += 1
        if i % k == 0 and z[i] >= n - i:
            return i // k
    return (n - 1) // k + 1

word = "abacaba"
k = 3
print(minimum_time_to_initial_state(word, k))

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。