ABC242B Minimize Ordering
题意分析¶
给定一个字符串 $S$,你可以对其中的所有字符重新排列(即任意打乱顺序)。任务是输出所有这些排列中字典序最小的那个字符串。
解题思路¶
为了让字符串的排列在字典序中最小,只需要将所有字符按从小到大排序即可。排序后的字符拼接起来的字符串,一定是所有排列中字典序最小的。
C++ 实现中的排序说明¶
字符串排序¶
在 C++ 中,字符串本质上是一个字符序列(类似于字符数组),因此可以直接使用 sort()
函数来排序。写法如下:
sort(s.begin(), s.end());
这里 s.begin()
和 s.end()
分别表示字符串 s
的起始位置和结束位置。是迭代器。
局部下标 $[l,r]$ 排序。
sort(s.begin() + l, s.begin() + r + 1);
该语句会直接修改字符串本身,将其中的字符按升序排列。如果需要从大到小排序,则需要使用第三个参数 greater<>()
。
例如 sort(s.begin(), s.end(), greater<>())
,sort(s.begin() + l, s.begin() + r + 1, greater<>());
。
数组排序¶
在 C++ 中,数组本质上是一个元素序列,因此也可以使用 sort()
函数来排序。写法如下:
for (int i = 0; i < n; i++) cin >> a[i];
sort(a, a + n);
// 局部下标 $[l,r]$ 排序
sort(a + l, a + r + 1);
如果输入的下标从 $1$ 开始则为:
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
// 局部下标 $[l,r]$ 排序
sort(a + l, a + r + 1);
这里 a
表示数组的起始位置,n
表示数组的长度。如果从大到小排序,则需要使用第三个参数 greater<>()
。
例如 sort(a, a + n, greater<>())
,sort(a + l, a + r + 1, greater<>());
。
字符串排序与数组排序的区别(C++)¶
排序对象 | 写法 | 参数类型 |
---|---|---|
字符串 | sort(s.begin(), s.end()); |
迭代器 |
数组 | sort(a, a + n); |
指针 |
具体实现¶
借助 sort
函数,直接对整个字符串从小到大排序即可得到答案。最后输出字符串 $s$ 即可。
复杂度总结¶
- 时间复杂度:$O(n\log n)$,其中 $n$ 为字符串长度;
- 空间复杂度:$O(1)$(就地排序,不开辟额外空间)
总结¶
- 将字符串排序即可得到字典序最小的排列;
C++
中对字符串使用sort(s.begin(), s.end())
;- 与数组的
sort(a, a + n)
写法不同,注意参数是迭代器还是指针。