问题描述:
- 给定一个字符串
s
和一个整数 k
,可以从 s
的前 k
个字母中选择一个并把它加到字符串的末尾,经过多次前述操作后字符串可以达到字典序最小。
核心思路:
- 初看难度是困难,以为不是模拟题,看了多个实例,当
k=1
时情况其实只能通过模拟来判断。【k=1
时操作是确定的,每次只能移动队首元素】
- 看了题解之后才意识到是脑筋急转弯,只要
k!=1
,都能够通过有限的操作使得字符串转变成排序后的结果。 - 代码实现不难,难在证明该思路的准确性。
- 官方题解也提及当
k=1
的时候可以通过 O(n^2)
的时间复杂度来模拟整个过程,也可以通过使用最小表示法来将时间复杂度降低到 O(n)
。
代码实现:
class Solution
{
public:
string orderlyQueue(string s, int k)
{
if(k > 1)
{
sort(s.begin(), s.end());
return s;
}
string ans = s;
int m = (int)s.size() - 1;
while(m-- > 0)
{
s += s[0];
s.erase(0, 1);
ans = min(s, ans);
}
return ans;
}
};