题目:
S
and T
are
strings composed of lowercase letters. In S
, no letter occurs more than once.
S
was sorted in some custom order previously. We want to permute the characters of T
so
that they match the order that S
was sorted. More specifically, if x
occurs
before y
in S
,
then x
should occur before y
in
the returned string.
Return any permutation of T
(as a string) that satisfies this property.
Example : Input: S = "cba" T = "abcd" Output: "cbad" Explanation: "a", "b", "c" appear in S, so the order of "a", "b", "c" should be "c", "b", and "a". Since "d" does not appear in S, it can be at any position in T. "dcba", "cdba", "cbda" are also valid outputs.
Note:
S
has length at most26
, and no character is repeated inS
.T
has length at most200
.S
andT
consist of lowercase letters only.
思路:
感觉这道题目的难度应该为easy才对^_^。我们首先统计出T中所有字符的出现次数,然后顺序遍历S中的每个字符,如果它在T中出现了,就拿出来添加在结果中。最后再将T中剩余的字符添加在结果的末尾即可(当然也可以添加在结果的头部或者任何部位)。算法的时间复杂度和空间复杂度都是O(n)。
代码:
class Solution {
public:
string customSortString(string S, string T) {
unordered_map<char, int> hash; // map from char to its appear count
for (auto c : T) {
++hash[c];
}
string ret;
for (auto s : S) { // insert the chars that appear in S
if (hash.count(s) > 0) {
ret.insert(ret.length(), hash[s], s);
hash[s] = 0;
}
}
for (auto it = hash.begin(); it != hash.end(); ++it) {
if (it->second > 0) { // insert the remaing chars that do not appear in S
ret.insert(ret.length(), it->second, it->first);
}
}
return ret;
}
};