2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3...长度为len的所有字符串。如果把所有字符串根据字典序排序,每个字符串都有

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3...长度为len的所有字符串。如果把所有字符串根据字典序排序,每个字符串都有相关的知识,希望对你有一定的参考价值。

2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3…长度为len的所有字符串。如果把所有字符串根据字典序排序,每个字符串都有所在的位置。给定一个字符串str,给定len,请返回str是总序列中的第几个。比如len = 4,字典序的前几个字符串为:a aa aaa aaaa aaab … aaaz … azzz b ba baa baaa … bzzz c …。a是这个序列中的第1个,bzzz是这个序列中的第36558个。

答案2021-11-18:

cdb,总共长度为7,请问cdb是第几个?
第一位c :
以a开头,剩下长度为(0~6)的所有可能性有几个
+
以b开头,剩下长度为(0~6)的所有可能性有几个
+
以c开头,剩下长度为(0)的所有可能性有几个
第二位d :
+
以ca开头的情况下,剩下长度为(0~5)的所有可能性有几个
+
以cb开头的情况下,剩下长度为(0~5)的所有可能性有几个
+
以cc开头的情况下,剩下长度为(0~5)的所有可能性有几个
+
以cd开头的情况下,剩下长度为(0)的所有可能性有几个
第三位b
+
以cda开头的情况下,剩下长度为(0~4)的所有可能性有几个
+
以cdb开头的情况下,剩下长度为(0)的所有可能性有几个。

代码用golang编写。代码如下:

package main

import "fmt"

func main() 
    s := "c"
    len0 := 2
    ret := kth(s, len0)
    fmt.Println(ret)

func kth(s string, len0 int) int 
    if len(s) == 0 || len(s) > len0 
        return -1
    
    num := []byte(s)
    ans := 0
    for i, rest := 0, len0-1; i < len(num); i, rest = i+1, rest-1 
        ans += int(num[i]-'a')*f(rest) + 1
    
    return ans


// 不管以什么开头,剩下长度为(0~len)的所有可能性有几个
func f(len0 int) int 
    ans := 1
    for i, base := 1, 26; i <= len0; i, base = i+1, base*26 
        ans += base
    
    return ans

执行结果如下:


左神java代码

以上是关于2021-11-18:给定一个长度len,表示一共有几位。所有字符都是小写(a~z),可以生成长度为1,长度为2,长度为3...长度为len的所有字符串。如果把所有字符串根据字典序排序,每个字符串都有的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj3238] [Ahoi2013] 差异

给定一个集合,查找集合中一共多多少种不同的元素

BZOJ4300 绝世好题

绝世好题bzoj4300

BZOJ4300: 绝世好题

poj1011(DFS+剪枝)