2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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] = []inti, 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
    

执行结果如下:


左神java代码

以上是关于2022-01-24:K 距离间隔重排字符串。 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少为 k。 所有输入的字符串的主要内容,如果未能解决你的问题,请参考以下文章

K-means聚类算法java实现

同样的数据,为啥每一次分析的Bootstrap值不同

重排数列_2018网易校招

POJ训练计划3096_Surprising Strings(STL/map)

华为笔试

K-th Closest Distance