题目:
Given a non-empty string containing an out-of-order English representation of digits 0-9
,
output the digits in ascending order.
Note:
- Input contains only lowercase English letters.
- Input is guaranteed to be valid and can be transformed to its original digits. That means invalid inputs such as "abc" or "zerone" are not permitted.
- Input length is less than 50,000.
Example 1:
Input: "owoztneoer" Output: "012"
Example 2:
Input: "fviefuro" Output: "45"
思路:
我刚刚开始觉得这道题目可以用BackTracking的方法来解决,后来发现想复杂了:其实根据0-9的英文字母的构成方式,可以直接推导出各个字母的出现次数。例如,g只会出现在eight中,x只会出现在six中等等。。。这样当建立起来字符串中字符和出现次数的哈希映射之后,我们就可以直接推导出各个英文单词的出现个数。
代码:
class Solution {
public:
string originalDigits(string s) {
map<char, int> letters;
vector<int> numbers(10, 0);
string ret;
for (char c: s) {
++letters[c];
}
// we have to follow this order strictly
numbers[8] = letters['g'];
numbers[6] = letters['x'];
numbers[4] = letters['u'];
numbers[2] = letters['w'];
numbers[0] = letters['z'];
numbers[5] = letters['f'] - numbers[4];
numbers[3] = letters['h'] - numbers[8];
numbers[7] = letters['s'] - numbers[6];
numbers[1] = letters['o'] - numbers[0] - numbers[2] - numbers[4];
numbers[9] = letters['i'] - numbers[5] - numbers[6] - numbers[8];
// construct the result
for (int i = 0; i < 10; i++) {
if (numbers[i] > 0) {
ret.insert(ret.end(), numbers[i], '0' + i);
}
}
return ret;
}
};