给定一个长度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个。
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
}
执行结果如下: