假设我们有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设置为空字符串
定义一个映射m,并将T中存在的每个字符的频率存储到m中
对于范围从0到S – 1的i
ret:= ret + x
x:= S [i]
对于j,范围从0到m [x] – 1
m [x]:= 0
对于每对,它在m-
因为我的范围是0到它的值– 1
ret:= ret连接它的键
如果它的值> 0,则
返回ret
让我们看下面的实现以更好地理解-
#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