2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串
2022-01-24:K 距离间隔重排字符串。
给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。
所有输入的字符串都由小写字母组成,如果找不到距离至少为 k 的重排结果,请返回一个空字符串 “”。
输入: s = “aabbcc”, k = 3。
输出: “abcabc” 。
解释: 相同的字母在新的字符串中间隔至少 3 个单位距离。
力扣358。
答案2022-01-24:
时间紧。具体见代码。
代码用golang编写。代码如下:
package main
import (
"fmt"
"sort"
)
func main() {
ret := rearrangeString("aabbcc", 3)
fmt.Println(ret)
}
func rearrangeString(s string, k int) string {
if len(s) < k {
return s
}
str := []byte(s)
cnts := make([][]int, 256)
for i := 0; i < 256; i++ {
cnts[i] = []int{i, 0}
}
maxCount := 0
for _, task := range str {
cnts[task][1]++
maxCount = getMax(maxCount, cnts[task][1])
}
maxKinds := 0
for task := 0; task < 256; task++ {
if cnts[task][1] == maxCount {
maxKinds++
}
}
N := len(str)
if !isValid(N, k, maxCount, maxKinds) {
return ""
}
ans := make([]string, 0)
for i := 0; i < maxCount; i++ {
ans = append(ans, "")
}
sort.Slice(cnts, func(i, j int) bool {
return cnts[j][1] <= cnts[i][1]
})
i := 0
for ; i < 256 && cnts[i][1] == maxCount; i++ {
for j := 0; j < maxCount; j++ {
ans[j] += fmt.Sprintf("%c", cnts[i][0])
}
}
out := 0
for ; i < 256; i++ {
for j := 0; j < cnts[i][1]; j++ {
ans[out] += fmt.Sprintf("%c", cnts[i][0])
out = twoSelectOne(out == len(ans)-2, 0, out+1)
}
}
builder := ""
for _, b := range ans {
builder += b
}
return builder
}
func isValid(N, k, maxCount, maxKinds int) bool {
restTasks := N - maxKinds
spaces := k * (maxCount - 1)
return spaces-restTasks <= 0
}
func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}
func twoSelectOne(c bool, a int, b int) int {
if c {
return a
} else {
return b
}
}
执行结果如下:

2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串的更多相关文章
- MFC 中 删除一个非空文件夹
MFC中提供了删除文件夹的一个封装函数 RemoveDirectory(LPCTSTR lpPathName),我们只要把要删除的文件夹的路径传进去就可以删除了,貌似一切如此简单.我象征性的建立一个文 ...
- Idea中包内中的置文件如何发布到编译后的目录中去
1.问题引入: 运行一个maven+springmvc+hibernate的项目的时候出现了下边的错误: Caused by: java.io.FileNotFoundException: class ...
- JS中if判断 非空即为真 非0即为真
1.字符串参与判断时:非空即为真判断字符串为空的方法if(str!=null && str!=undefined && str !='')可简写为if(!str){ ...
- [LeetCode] 862. Shortest Subarray with Sum at Least K 和至少为K的最短子数组
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- C++ 中判断非空的错误指针
最近在写网络上的东西,程序经过长时间的运行,会出现崩溃的问题,经过DUMP文件的查看,发现在recv的地方接收返回值的时候,数据的长度异常的大差不多16亿多字节.而查看分配后的char指针显示为错误的 ...
- [Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K
Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...
- C语言:将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换。-删除指针p所指字符串中的所有空白字符(包括制表符,回车符,换行符)-在带头结点的单向链表中,查找数据域中值为ch的结点,找到后通过函数值返回该结点在链表中所处的顺序号,
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ...
- C语言:假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母。-利用折半查找整数m在有序数组中的位置,若找到,返回下标值,否则返回-1。
//假定输入的字符串只包含字母和*号,fun函数:除了尾部的*号以外,将字符的其他*号进行全部删除,形参p已经指向字符串中最后一个字母. #include <stdio.h> void f ...
- Day_11【集合】扩展案例2_使用普通for循环获取集合中索引为3的元素并打印,统计集合中包含字符串"def"的数量,删除集合中的所有字符串",将集合中每个元素中的小写字母变成大写字母def",
分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串"abc" "def" "efg" "def" ...
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
随机推荐
- Django中间件的介绍及使用
1.中间件的理解: 是用来处理Django请求与响应的框架级别的钩子,处于wsgi模块与视图函数之间,在执行视图函数之前和之后所做 的动作,是一个轻量级.低级别的插件,作用于全局,使用不当很 ...
- ESP32开发环境搭建 IDF3.3.5+VScode
1. 软件准备: ① ESP-IDF:包含ESP32 API和用于操作工具链的脚本. ②工具链msys32:用于编译ESP32应用程序. ③编辑工具Visual Studio Code 注意:工具链 ...
- Windows命令行备份文件
windows命令行备份文件 0 前言 前段时间,笔者因为在C盘爆满的情况下被windows自动更新了(大概),出现了以下情况: 在试了几种方法后不起作用,无奈下只能重装系统. 在这之前要把之前的一些 ...
- cl 编译器环境配置
安装 visual studio 2019 其他版本路径可能有差别,需自行对照查找. visual studio 2019安装目录 和 Windows kits 文件夹[在同一目录下] 即VS 如果安 ...
- 在不使用SQL过程化编程的情况下,实现一个条件结构【SQL149 根据指定记录是否存在输出不同情况】
题目地址 https://www.nowcoder.com/practice/f72d3fc27dc14f3aae76ee9823ccca6b 思路 加了3列标记位,来达成目的.不直观而且占用内存,但 ...
- java多线性--线程创建
java多线性--线程创建 什么是多线程:不同的功能同时进行 Process(进程)与Thread(线程) 进程是执行程序的一次执行过程,是一个动态的概念.是系统分配资源的单位. 一个进程分为多个线程 ...
- Java面试——Nginx
一. 二.Nginx 的优点 [1]速度更快:这表现在两个方面:一方面,在正常情况下,单次请求会得到更快的响应:另一方面,在高峰期(如有数以万计的并发请求),Nginx 可以比其他 Web服务器更快地 ...
- 一个基于GPT模型实现的Git Commit信息自动生成工具
每次提交代码的时候,你是否有为如何写Commit Message而迟迟按不下提交的时刻呢?然后,死磨硬泡写了一些并提交后,又被review的小伙伴吐槽了呢?相信很多小伙伴有过这样的经历吧? 趁着最近C ...
- 机器学习基础05DAY
分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...
- 19.3 对FAT的支持(harib16c)
19.3 对FAT的支持(harib16c) 问题:可以正确显示文件开头的512字节的内容,但大于512字节的部分不能正确显示(可能会显示其他文件). 问题本质:磁盘可能将大于512字节的文件离散的保 ...