# 题目描述
小红希望你构造一个字符串,满足以下两个条件
- 字符串仅有小写字母构成,且某种小写字母都出现了至少 2 次
- 对于任意小写字母,该字母在字符串中出现下标的最短距离恰好等于
k
输入描述:
- 一个正整数 k
- 1 <= k <= 25
输出描述:
合法的字符串。保证输出的字符串长度不超过10^5,有多个解时输出任意合法解即可
# 测试用例
用例 1:
- 输入: 1
- 输出: qqwweeerrttyyuuiiooppaassddffgghhjjkkllzzxxccvvbbnnmm
用例 2:
- 输入:2
- 输出:ababcdcdefefghghijijklklmnmnopopqrqrststuvuvwxwxyzyz
# 思路
至少出现 2 次 + 最短距离
因为至少出现 2 次,所以我们优先保证每个字符可以出现 2 次,那这两次分别应该在哪个位置呢,这时候就结合最短距离这个限制,让两次出现的位置之间的距离为 k ,这样就同时满足了条件2
如何保证出现的距离为 k 呢,就按照字符组的顺序组合 k 个字符,比如 k = 3 时,就组合这个 abc 字符串,然后保证出现 2 次,就再 abc 之后再插入 一遍 abc, 这样就既保证了条件1,又保证了条件2,然后再放 defdef ,直到遍历到 z
因为 z后面没有字符了,所以我们可以让指针指到字符组的头部,再放入一遍放过的元素,这不会影响条件2,因为要求的是最短距离
同时,这道题没有规定输出的顺序,所以我们不必关注字符的先后顺序,只需保证出现 2 次 +最短距离这两个条件即可
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入k: ");
const k = parseInt(readline());
const setString = function (k) {
const arr = [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
];
let pos = 0;
let str = "";
while (pos < 26) {
const temp = arr.slice(pos, pos + k).join("");
str += temp + temp;
pos += k;
}
console.log("结果为: ", str);
};
setString(k);
/*
请输入k:
3
结果为: abcabcdefdefghighijkljklmnomnopqrpqrstustuvwxvwxyzayza
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77