有序佇列在 C++ 中


假設出現字串 S。S 中的所有字母均為小寫。然後,可以執行任意多次移動。

在此,在每次移動中,我們選擇前 K 個字母中的一個,將其刪除,並將其放在字串的末尾。我們必須找到任意多次移動後可能獲得的按字典序最小的字串。

因此,如果輸入類似於 "cabaa" 並且 K = 3,則輸出將為 "aaabc"

要解決此問題,我們將遵循以下步驟 -

  • 如果 K > 1,則 -

    • 對陣列 S 進行排序

    • 返回 S

  • ret := S

  • n := S 的大小

  • 對於初始化 i := 1,當 i < n,更新(使 i 增加 1),執行 -

    • S := 裁切 S 的第一個字元並在結尾處將其新增到 S 中

    • 如果 S < ret,則 -

      • ret = S

  • 返回 ret

讓我們看看以下實現以獲得更好的理解 -

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string orderlyQueue(string S, int K) {
      if(K > 1){
         sort(S.begin(), S.end());
         return S;
      }
      string ret = S;
      int n = S.size();
      for(int i = 1; i < n; i++){
         S = S.substr(1) + S.substr(0, 1);
         if(S < ret) ret = S;
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.orderlyQueue("cabaa", 3));
}

輸入

"cabaa", 3

輸出

aaabc

更新時間: 2020 年 6 月 4 日

175 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告