给定一个数字k,要求构造一个字符串,满足字符串中左右相同字符最小距离恰好是k。
构造的方法有很多,最容易想到的就是用一个不会违反题意的字符串将每个字符隔开。比如k=5,那就先令s0=abcd(s0的长度为k−1),然后放置e,用该字符串隔开,这样就变成了s=eabcdeabcd,之后再放置f,于是就成了eabcdeabcdfabcdfabcd。后续其它小写字母也按照此规律构造即可。
#include <iostream>
#include <string>
using namespace std;
int main() {
int k;
cin >> k; // 输入一个整数 k
string fx = "";
// 生成字符串 fx,包含从 'a' 到 'a' + k - 2 的字符
for (int i = 0; i < k - 1; i++) {
fx += char('a' + i);
}
// 从 'a' + k - 1 开始循环到 'z'
for (int g = 'a' + k - 1; g <= 'z'; g++) {
bool ok = true;
// 检查字符 g 是否在字符串 fx 中存在
for (char ch : fx) {
if (ch == char(g)) {
ok = false;
break;
}
}
// 如果字符 g 不在字符串 fx 中,则输出相应的字符串
if (ok) {
cout << char(g) + fx + char(g) + fx;
}
}
return 0;
}
k = int(input()) # 输入一个整数 k
fx = ""
# 生成字符串 fx,包含从 'a' 到 'a' + k - 2 的字符
for i in range(k - 1):
fx += chr(ord('a') + i)
# 从 'a' + k - 1 开始循环到 'z'
for g in range(ord('a') + k - 1, ord('z') + 1):
ok = True
# 检查字符 g 是否在字符串 fx 中存在
for ch in fx:
if ch == chr(g):
ok = False
break
# 如果字符 g 不在字符串 fx 中,则输出相应的字符串
if ok:
print(chr(g) + fx + chr(g) + fx, end="")
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k = scanner.nextInt(); // 输入一个整数 k
scanner.close();
StringBuilder fx = new StringBuilder();
// 生成字符串 fx,包含从 'a' 到 'a' + k - 2 的字符
for (int i = 0; i < k - 1; i++) {
fx.append((char) ('a' + i));
}
// 从 'a' + k - 1 开始循环到 'z'
for (int g = 'a' + k - 1; g <= 'z'; g++) {
boolean ok = true;
// 检查字符 g 是否在字符串 fx 中存在
for (int i = 0; i < fx.length(); i++) {
if (fx.charAt(i) == (char) g) {
ok = false;
break;
}
}
// 如果字符 g 不在字符串 fx 中,则输出相应的字符串
if (ok) {
System.out.print((char) g + fx.toString() + (char) g + fx.toString());
}
}
}
}
小红拥有所有的26个小写字母,但是他们太杂乱了,十分地不优雅。
为了让字母优雅起来,他找到了你,优雅大师!你需要帮助小红合理地排列所有的小写字母,要求每个字母至少出现两次,并且每个字母相差最小距离恰好是k。
一行一个整数k(k≤25)
排列后的字符串,长度不能超过105
输入
1
输出
qqwweerrttyyuuiiooppaassddffgghhjjkkllzzxxccvvbbnnmm