思路一 : hash O(n)
实现细节:把T中出现的字符个数放到hash中,遍历S,按照每个出现的顺序放到ans中,然后遍历26,将没有出现在S中的放到ans中即可。
判断字符是否在S中的做法:由于S中的字符不重复,因此可以用位运算做hash来存储S中每个字符的状态,判断某个字符在不在S中用位运算’&'即可。
具体步骤:
step1:填hash
step2:遍历order,将在order中的字符个数放在前面
step3:遍历26,将不在order中的字符个数放在后面
class Solution {
public:
string customSortString(string order, string s) {
int cnt[26] = {0};
unordered_set<char> hash(order.begin(), order.end());
string ans;
for (auto& each : s) {
cnt[each - 'a']++;
}
for (auto& ch : order) {
for (int i = 0; i < cnt[ch - 'a']; ++i) {
ans += ch;
}
}
for (int i = 0; i < 26; ++i) {
if (!hash.count('a' + i) && cnt[i]) {
for (int j = 0; j < cnt[i]; ++j) {
ans += ('a' + i);
}
}
}
return ans;
}
};
思路二:自定义cmp O(nlogn)
class Solution {
public:
string customSortString(string order, string s) {
int p[26] = {0}; //优先级
int n = order.size(), m = s.size();
for (int i = 0; i < n; ++i) {
p[order[i] - 'a'] = n - i;
}
auto cmp = [&](char ch1, char ch2) {
return p[ch1 - 'a'] > p[ch2 - 'a'];
};
sort(s.begin(), s.end(), cmp);
return s;
}
};