27. abc串
有一个字符串集合,所有字符串的长为 nn, 只由 'a', 'b', 'c' 三种字符组成,而且每个字符串中,所有相邻字符都是不同的。
请编写一个程序,返回这个字符串集合中,字典序第 kk 小的字符串。
样例
样例输入:
n = 3
k = 6
样例输出:
"bac"
说明
在样例中,长为 33 的字符串的集合如下:
["aba", "abc", "aca", "acb"
,"bab", "bac", "bca", "bcb"
."cab", "cac", "cba", "cbc"]
所以字典序第 66 小的字符串为 "bac"。
注意事项
1 \le n \le 10^5
1≤n≤1
0
5
.
1 \le k \le 10^{18}
1≤k≤1
0
18
.
如果所有可组成的字符串个数小于 kk,返回一个空串。
精度
public class Solution {
/**
* @param n: the length of the string.
* @param k: the kth Lexicographically smallest that result should be.
* @return: return the kth Lexicographically smallest string.
*/
public String kthString(int n, long k) {
long max = 3;
int kn = 1;
while (max < k) {
max = max * 2;
kn++;
}
if (n < kn) return "";
int len=Math.min(n,62);
max=max/3;
while(kn<len){
max = max * 2;
kn++;
}
StringBuilder result = new StringBuilder();
char last = 'b';
k--;
if(n>len){
while(n>len){
switch (last) {
case 'a':
last = 'b';
break;
case 'b':
last = 'a';
break;
}
// System.out.println(n+","+len);
result.append(last);
n--;
}
}
int i = (int) (k / max);
switch (i) {
case 0:
last = 'a';
break;
case 1:
last = 'b';
break;
case 2:
last = 'c';
break;
}
result.append(last);
n--;
while (n > 0) {
int j = 0;
if (max >= 2) {
k = k % max;
max = max / 2;
j = (int) (k / max);
// System.out.println(k+","+max+","+j);
}
switch (last) {
case 'a':
if (j == 0) {
last = 'b';
} else {
last = 'c';
}
break;
case 'b':
if (j == 0) {
last = 'a';
} else {
last = 'c';
}
break;
case 'c':
if (j == 0) {
last = 'a';
} else {
last = 'b';
}
break;
}
result.append(last);
n--;
}
return result.toString();
}
}
精度过高,越界
public String kthString(int n, long k) {
n--;
long max = (long) (Math.pow(2, n));
if (max * 3 < k) return "";
StringBuilder result = new StringBuilder();
char last='a';
k--;
int i = (int) (k / max);
switch (i) {
case 0:
last='a';
break;
case 1:
last='b';
break;
case 2:
last='c';
break;
}
result.append(last);
while (n > 0) {
int j=0;
if(max>=2){
k=k%max;
max=max/2;
j = (int) (k / max);
}
// System.out.println(k+","+max+","+j);
switch (last) {
case 'a':
if (j==0){
last='b';
}else {
last='c';
}
break;
case 'b':
if (j==0){
last='a';
}else {
last='c';
}
break;
case 'c':
if (j==0){
last='a';
}else {
last='b';
}
break;
}
result.append(last);
n--;
}
return result.toString();
}