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代码