2024-05-04: 用go语言, 给定一个起始索引为0的字符串s和一个整数

架构师课程2024-05-04 14:45:46  72

要进行分割操作,直到字符串s为空:

选择s的最长前缀,该前缀最多包含k个不同字符;

删除该前缀,递增分割计数。如果有剩余字符,它们保持原来的顺序。

在操作之前,可以修改字符串s中的一个字符为另一个小写英文字母。

在最佳情况下修改至多一次字符后,返回操作结束时得到的最大分割数量。

输入:s = "accca", k = 2。

输出:3。

答案2024-05-04:

chatgpt

题目来自leetcode3003。

大体步骤如下:

1.创建一个递归函数dfs,用于计算分割得到的最大数量。

2.函数中,首先检查是否到达字符串末尾,若是则返回 1(表示完成一个分割)。

3.使用memo记录中间结果,加快计算速度。

4.对于当前处理的字符s[i],如果不将其作为新的分割点,继续处理下一个字符。

5.如果将s[i]作为新的分割点,并且新的字符数量不超过k,则继续向后处理。

6.如果未修改过字符,则尝试修改s[i]为其他26个小写字母,然后继续考虑分割带来的最大数量。

7.在每一步中,根据是否修改过字符,记录当前的最大分割数量。

8.最终返回得到的最大分割数量。

总的时间复杂度为 $O(n cdot 2^{26})$,其中$n$为字符串长度,$2^{26}$表示尝试修改字符的可能性数目。

总的额外空间复杂度为$O(n cdot 2^{26})$,主要由memo中间结果记录所占用的空间引起。

Go完整代码如下:

package mainimport ( "fmt" "math/bits")func max(x, y int) int { if x > y { return x } return y}func maxPartitionsAfterOperations(s string, k int) int { n := len(s) type args struct { i, mask int changed bool } memo := map[args]int{} var dfs func(int, int, bool) int dfs = func(i, mask int, changed bool) (res int) { if i == n { return 1 } a := args{i, mask, changed} if v, ok := memo[a]; ok { // 之前计算过 return v } // 不改 s[i] bit := 1 << (s[i] - 'a') newMask := mask | bit if bits.OnesCount(uint(newMask)) > k { // 分割出一个子串,这个子串的最后一个字母在 i-1 // s[i] 作为下一段的第一个字母,也就是 bit 作为下一段的 mask 的初始值 res = dfs(i+1, bit, changed) + 1 } else { // 不分割 res = dfs(i+1, newMask, changed) } if !changed { // 枚举把 s[i] 改成 a,b,c,...,z for j := 0; j < 26; j++ { newMask := mask | 1< k { // 分割出一个子串,这个子串的最后一个字母在 i-1 // j 作为下一段的第一个字母,也就是 1<

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-def max_partitions_after_operations(s, k): n = len(s) memo = {} def dfs(i, mask, changed): if i == n: return 1 a = (i, mask, changed) if a in memo: return memo[a] res = 0 bit = 1 << (ord(s[i]) - ord('a')) new_mask = mask | bit if bin(new_mask).count('1') > k: res = dfs(i + 1, bit, changed) + 1 else: res = dfs(i + 1, new_mask, changed) if not changed: for j in range(26): new_mask = mask | 1 << j if bin(new_mask).count('1') > k: res = max(res, dfs(i + 1, 1 << j, True) + 1) else: res = max(res, dfs(i + 1, new_mask, True)) memo[a] = res return res return dfs(0, 0, False)s = "accca"k = 2result = max_partitions_after_operations(s, k)print(result)

在这里插入图片描述

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/412375.html
0
随机主题
iPhone带手机壳散热不好?不可能,绝对不可能!金属手机壳“17筑梦·更有爱” 建德这场青年人才交友派对甜度超标!参展机构增加2419家! 几组数据看深圳文博会蓬勃生机浙江省生物多样性保护优秀案例公布 | “象山县全民守护中华凤头燕鸥”案例成功入选提供消费便利, 老字号“特产”再进社区邻里节700多能买到这么顶顶内存?阿斯加特联名华硕实测!朱一珺新搭档孙文骏 孙文骏(石宇奇教练孙俊之子)日媒: 初创企业成乌军用无人机开发主力塞拉利昂总统出席中铁十局唐克里里铁矿项目主体竣工仪式高铁为什么能转弯? 看完一清二楚斗罗大陆: 92%神性, 唐三成为封号斗罗, 99级以下没人能将他打败日本通运将预留1000亿日元用于海外并购女子为了帮衬娘家, 婚内转移财产300万, 丈夫得知后诉讼离婚星途凌云w者版领衔 20万以内四款质价比超高的SUV三个如花似玉的公主咋就出不了一个王后?开国大将陈赓有5个子女, 他们如今过得如何? 三个儿子是少将美联储公布5月会议纪要 通胀风险仍需高度关注丨从华尔街到陆家嘴9C秘籍 | 让竞争对手认知超越你的10大方法郭有才必须停播, 说他是教育界的毒瘤, 其实是名副其实明天会更好, 尤文多位球员开启续约计划, 门将补强盯上国米青训美国涨新能源车关税因为拆了海鸥?中国新能源车崛起老美挡不住
最新回复(0)