2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。 要进行分割操作,直到字符串s为空: 选择s的最长前缀,该前缀最多包含k个不同字符; 删除该前缀,递增分割计数。如果有剩余
2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。
要进行分割操作,直到字符串s为空:
选择s的最长前缀,该前缀最多包含k个不同字符;
删除该前缀,递增分割计数。如果有剩余字符,它们保持原来的顺序。
在操作之前,可以修改字符串s中的一个字符为另一个小写英文字母。
在最佳情况下修改至多一次字符后,返回操作结束时得到的最大分割数量。
输入:s = "accca", k = 2。
输出:3。
答案2024-05-04:
题目来自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$表示尝试修改字符的可能性数目。
总的额外空间复杂度为$O(n \cdot 2^{26})$,主要由memo中间结果记录所占用的空间引起。
Go完整代码如下:
package main
import (
"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<<j
if bits.OnesCount(uint(newMask)) > k {
// 分割出一个子串,这个子串的最后一个字母在 i-1
// j 作为下一段的第一个字母,也就是 1<<j 作为下一段的 mask 的初始值
res = max(res, dfs(i+1, 1<<j, true)+1)
} else { // 不分割
res = max(res, dfs(i+1, newMask, true))
}
}
}
memo[a] = res // 记忆化
return res
}
return dfs(0, 0, false)
}
func main() {
s := "accca"
k := 2
result := maxPartitionsAfterOperations(s, k)
fmt.Println(result)
}

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 = 2
result = max_partitions_after_operations(s, k)
print(result)

2024-05-04:用go语言,给定一个起始索引为0的字符串s和一个整数k。 要进行分割操作,直到字符串s为空: 选择s的最长前缀,该前缀最多包含k个不同字符; 删除该前缀,递增分割计数。如果有剩余的更多相关文章
- poj1056(字符串判断是否存在一个字符串是另一个字符串的前缀)
题目链接:https://vjudge.net/problem/POJ-1056 题意:给定一个字符串集,判断是否存在一个字符串是另一个字符串的前缀. 思路:和hdoj1671一样,有两种情况: 当前 ...
- [leetcode]340. Longest Substring with At Most K Distinct Characters至多包含K种字符的最长子串
Given a string, find the length of the longest substring T that contains at most k distinct characte ...
- [LeetCode] 340. Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
Given a string, find the length of the longest substring T that contains at most k distinct characte ...
- [LeetCode] Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串
Given a string S, find the length of the longest substring T that contains at most two distinct char ...
- python Trie树和双数组TRIE树的实现. 拥有3个功能:插入,删除,给前缀智能找到所有能匹配的单词
#coding=utf- #字典嵌套牛逼,别人写的,这样每一层非常多的东西,搜索就快了,树高26.所以整体搜索一个不关多大的单词表 #还是O(). ''' Python 字典 setdefault() ...
- Redis删除特定前缀key的优雅实现
还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹! Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案 re ...
- [LeetCode] 159. Longest Substring with At Most Two Distinct Characters 最多有两个不同字符的最长子串
Given a string s , find the length of the longest substring t that contains at most 2 distinct char ...
- Redis删除相同前缀的key
如何优雅地删除Redis set集合中前缀相同的key? Redis中有删除单条数据的命令DEL,却没有批量删除特定前缀key的指令,但我们经常遇到需要根据前缀来删除的业务场景 ...
- 算法战斗:给定一个号码与通配符问号W,问号代表一个随机数字。 给定的整数,得到X,和W它具有相同的长度。 问:多少整数协议W的形式和的比率X大?
如果说: 给定一个号码与通配符问号W,问号代表一个随机数字. 给定的整数,得到X,和W它具有相同的长度. 问:多少整数协议W的形式和的比率X大? 进格公式 数据的多组,两排各数据的,W,第二行是X.它 ...
- 最多有k个不同字符的最长子字符串 · Longest Substring with at Most k Distinct Characters(没提交)
[抄题]: 给定一个字符串,找到最多有k个不同字符的最长子字符串.eg:eceba, k = 3, return eceb [暴力解法]: 时间分析: 空间分析: [思维问题]: 怎么想到两根指针的: ...
随机推荐
- 学习Source Generators之HelloWorld
介绍 源生成器是 C# 开发人员可以编写的一种新组件,允许执行两个主要操作: 检索表示正在编译的所有用户代码的编译对象. 可以检查此对象,并且可以编写适用于正在编译的代码的语法和语义模型的代码,就像现 ...
- RelationNet++:基于Transformer融合多种检测目标的表示方式 | NeurIPS 2020
论文提出了基于注意力的BVR模块,能够融合预测框.中心点和角点三种目标表示方式,并且能够无缝地嵌入到各种目标检测算法中,带来不错的收益 来源:晓飞的算法工程笔记 公众号 论文: RelationN ...
- ABC326 A-F
vp on 2023.11.12 A.B:略. C:双指针或者二分. D:暴搜+剪枝,每一行的计算量最多是 $60$. E:期望相关.计算每个点的概率,乘上这个点的权值,并求和即可. F:meet i ...
- .Net Core AutoFac 使用方法讲解大全,具体详细使用知识总结
AutoFac 具体使用知识总结 阅读前提示 AutoFac 只是众多IOC框架的其中一种, 比较主流的有Unity.autofac.spring.net.MEF.Injection.Asp.Net ...
- 21 JSONP
JSONP 为了解决浏览器跨域问题. jquery提供了jsonp请求. 在网页端如果见到了服务器返回的数据是: xxxxxxxxxxdjsfkldasjfkldasjklfjadsklfjasd ...
- #贪心#CF605A Sorting Railway Cars
题目 一个长度为 \(n\) 的排列,每次可以将一个数移至开头或者结尾,问最少多少次使其升序排列 分析 让数字连续的情况尽量多才能让移出来的次数尽量少, 找到最长的数字连续段,若其长度为 \(len\ ...
- #01背包#洛谷 4161 [SCOI2009]游戏
题目 将 \(n\) 拆成若干个正整数的和, 问这些正整数的LCM有多少种 \(n\leq 10^3\) 分析 考虑这个\(LCM\)一定是1或者由若干个质数的指数幂相乘得到的, 那么可以设\(dp[ ...
- #线段树,离线#CF1000F One Occurrence
题目 给定一个长度为\(n\)序列,\(m\)个询问,每次询问给定一个区间\([l,r]\), 如果这个区间里存在只出现一次的数,输出这个数(如果有多个就输出任意一个),没有就输出0 分析 考虑离线, ...
- gRPC入门学习之旅(五)
gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) 通过之前的文章,我们已经创建了gRPC的服务端应用程序,那么应该如何来使用这个服务端应用 ...
- 本周四晚19:00知识赋能第八期第2课丨ArkUI自定义组件
9月21日19:00~20:00,第八期知识赋能第2节直播就要开始啦!本次直播将为同学们带来涂鸦小游戏的趣味体验,让大家全面了解ArkUI框架的应用,帮助你们在自己已有专业的基础上拓宽知识边界,学习 ...