题目大意
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。
注意:
- 输入只包含小写英文字母。
- 输入保证合法并可以转换为原始的数字,这意味着像 “abc” 或 “zerone” 的输入是不允许的。
- 输入字符串的长度小于 50,000。
示例 1:
输入: "owoztneoer"
输出: "012" (zeroonetwo)
示例 2:
输入: "fviefuro"
输出: "45" (fourfive)
解题思路
先统计给定字符串中每个字符的出现频率,然后分别计算每个数字出现的次数。
例如:0(zero),在0~9的英文单词中,只有zero中有’z’这个单词,因此字符串中有多少个’z’,就有多少个数字0。 6(six),只有six中有’x’这个单词,因此有多少个’x’就有多少个数字6。以此类推即可。
class Solution {
private:
string dup(int num, int count){
string tmp;
for (int i = 0; i < count; ++i)
tmp += to_string(num);
return tmp;
}
public:
string originalDigits(string s) {
if (s.empty())
return "";
map<char, int> dict;
for (int i = 0; i < s.size(); ++i)
++dict[s[i]];
int s0 = dict['z'];
int s6 = dict['x'];
int s7 = dict['s'] - s6;
int s5 = dict['v'] - s7;
int s4 = dict['u'];
int s3 = dict['r'] - s4 - s0;
int s8 = dict['g'];
int s9 = dict['i'] - s5 - s6 - s8;
int s2 = dict['w'];
int s1 = dict['o'] - s0 - s2 - s4;
vector<int> nums{s0, s1, s2, s3, s4, s5, s6, s7, s8, s9};
string res;
for (int i = 0; i < nums.szie(); ++i){
res += dup(i, nums[i]);
}
return res;
}
};