字典序:通俗易懂的来说就是按照查找字典的先后顺序排序
例子一:aaaa与aaa,因为在字典查找的时候,aaa的第四位为空,而aaaa第四位有字符,所以比aaa多查找一次,故而aaa与aaaa的字典序排序为aaa>aaaa;
例子二:aab与aaa,在字典中查找的过程中,b在字典中排在a的后面,所以aaa>aab;
具体代码实现:
#include<bits/stdc++.h>
using namespace std;
string ch;
int n, x;
int main() {
cin >> n >> x >> ch;
// 对字符串进行字典序排序
sort(ch.begin(), ch.end());
// 检查第0个字符和第x个字符是否不同
if (ch[0] != ch[x - 1]) {
// 如果不同,则输出第x个字符
cout << ch[x - 1];
return 0; // 输出后直接退出程序
}
// 输出排序后的第0个字符(也是最小的字符)
cout << ch[0];
// 检查第x个字符和最后一个字符是否不同
if (ch[x - 1] != ch[n - 1]) {
// 如果不同,则输出从第x个字符到字符串末尾的所有字符
for (int i = x; i < n; i++) {
cout << ch[i];
}
}
else {
// 如果第x个字符和最后一个字符相同,则输出若干个最后一个字符
// 注意:这里的逻辑可能不符合预期,因为(n-1)/x可能不是整数
for (int i = 0; i < (n - 1) / x; i++) {
cout << ch[n - 1];
}
}
}
实现逻辑:
第一个判断,针对的一段不重复的字符串判断,比如abcdefg中,无论如何组合排列,最小的字典序字符串为c开头,因此直接输出最小的c便是答案
if (ch[0] != ch[x - 1]) {
cout << ch[x - 1];
return 0;
}
第二个判断,便是判断前面几位都是大于后面一个字符串的情况,例如aabbcd,那么字典序排序中差值最小的方法为a与abbcd两个字符串,故abbcd字符串为最小值,输出即可
if (ch[x - 1] != ch[n - 1]) {
for (int i = x; i < n; i++) {
cout << ch[i];
}
}
第三个判断,便是判断整个字符串上的所有值是否相同,在sort(ch.begin(), ch.end());在字典序排序后如果第一位与最后一位的值相等,那么在整个字符串中的所有值相等,只需要根据分多少段排序即可,例如:aaaaa分为两段aaa与aa,然后输出aaa即可
else {
for (int i = 0; i < (n - 1) / x; i++) {
cout << ch[n - 1];
}
}