C++自定義字串排序


假設我們有兩個字串S和T,它們都由小寫字母組成。在S中,每個字母最多出現一次。S之前按某種自定義順序排序過。我們需要對T的字元進行排列,使其與S排序的順序匹配。更具體地說,如果x在S中出現在y之前,那麼x將在返回的字串中出現在y之前。

例如,如果S = “cba”而T = “abcd”,則輸出將是“cbad”。因為“a”、“b”、“c”出現在S中,所以“a”、“b”、“c”的順序應該是“c”、“b”和“a”。由於“d”沒有出現在S中,它可以在T中的任何位置。“dcba”、“cdba”、“cbda”也是有效的輸出。

為了解決這個問題,我們將遵循以下步驟:

  • 將ret設定為空字串

  • 定義一個map m,並將T中每個字元的頻率儲存到m中

  • 對於i從0到S的長度減1

    • x := S[i]

    • 對於j從0到m[x]減1

      • ret := ret + x

    • m[x] := 0

  • 對於m中的每個鍵值對it:

    • 如果it的值 > 0,則

      • 對於i從0到it的值減1

        • ret := ret連線it的鍵

  • 返回ret

示例(C++)

讓我們來看下面的實現,以便更好地理解:

線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string customSortString(string S, string T) {
      string ret = "";
      unordered_map <char, int> m;
      for(int i = 0; i < T.size(); i++){
         m[T[i]]++;
      }
      for(int i = 0; i < S.size(); i++){
         char x = S[i];
         for(int j = 0; j < m[x]; j++){
            ret += x;
         }
         m[x] = 0;
      }
      unordered_map <char, int> :: iterator it = m.begin();
      while(it != m.end()){
         if(it->second > 0){
            for(int i = 0; i < it->second; i++)ret += it->first;
         }
         it++;
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.customSortString("cba", "abcd"));
}

輸入

"cba"
"abcd"

輸出

cbad

更新於:2020年5月2日

438 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.