LeetCode 有序队列(数学问题)

给出了一个由小写字母组成的字符串 S。然后,我们可以进行任意次数的移动。

在每次移动中,我们选择前 K 个字母中的一个(从左侧开始),将其从原位置移除,并放置在字符串的末尾。

返回我们在任意次数的移动之后可以拥有的按字典顺序排列的最小字符串。

示例 1:

输入:S = "cba", K = 1
输出:"acb"
解释:
在第一步中,我们将第一个字符(“c”)移动到最后,获得字符串 “bac”。
在第二步中,我们将第一个字符(“b”)移动到最后,获得最终结果 “acb”。

示例 2:

输入:S = "baaca", K = 3
输出:"aaabc"
解释:
在第一步中,我们将第一个字符(“b”)移动到最后,获得字符串 “aacab”。
在第二步中,我们将第三个字符(“c”)移动到最后,获得最终结果 “aaabc”。

提示:

1 <= K <= S.length <= 1000
S 只由小写字母组成。

思 路 分 析 : \color{blue}思路分析: 这道题有一个数学规律,当K == 1时,这时只能一个一个的将首端字符移动到尾端,寻找字典顺序最小的排列,当K > 1时,选择不同的移动顺序可以得到S串任意的排列,因此当K > 1直接进行排序得到最小的字典顺序排列。

注意:由于string并没有pop_front()操作,所以在将首端字符移动到尾端时有点点麻烦。蛋式我们可以将tempStr = S+S,再取tempStr的以i起始,长度为len(S)的子串,这样得到的子串就相当于把S[i]前面的字符移动到S的尾端。

class Solution {
public:
    string orderlyQueue(string S, int K) {
        if (K == 1){
        	//当K == 1时,一个一个的将首端字符移动到尾端,寻找字典顺序最小的排列
            int strSize = S.size();
            string tempStr = S + S;
            for (int i = 0; i < strSize; ++i){
                if (tempStr.substr(i, strSize) < S){
                    S = tempStr.substr(i, strSize);
                }
            }
        }
        else{
        	//当K > 1直接进行排序得到最小的字典顺序排列
            sort(S.begin(), S.end());
        }
        return S;
    }
};

LeetCode 有序队列(数学问题)_第1张图片

你可能感兴趣的:(LeetCode,字符串,数学)