# 题目描述

小红希望你构造一个字符串,满足以下两个条件

  1. 字符串仅有小写字母构成,且某种小写字母都出现了至少 2 次
  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