423. 从英文中重建数字
给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。
例 1:输入:s = "owoztneoer"
输出:"012"示例 2:输入:s = "fviefuro"
输出:"45"
提示:
- 1 <= s.length <= 105
- s[i] 为 [“e”,“g”,“f”,“i”,“h”,“o”,“n”,“s”,“r”,“u”,“t”,“w”,“v”,“x”,“z”] 这些字符之一
- s 保证是一个符合题目要求的字符串
解题思路
首先我们可以统计每个字母分别在哪些数字中出现:
字母 数字
e 0 1 3 5 7 8 9
f 4 5
g 8
h 3 8
i 5 6 8 9
n 1 7 9
o 0 1 2 4
r 0 3 4
s 6 7
t 2 3 8
u 4
v 5 7
w 2
x 6
z 0
- 我们发现对于guwxz,他们只在特定的数字8 4 2 6 0里面出现,因此我们只有检查到这些字母,就可以确定其对应数字的出现次数.
- 对于h来说,它出现在3 8两个数字里面,因为我们通过g可以得出8的出现次数,因此我们可以通过这个得出3的出现次数。
- 对于s来说,它出现在6 7两个数字里面,因为我们通过x可以得出7的出现次数,因此我们可以通过这个得出6的出现次数。
- 对于f来说,它出现在5 4两个数字里面,因为我们通过u可以得出4的出现次数,因此我们可以通过这个得出5的出现次数。
- 因为o在0 1 2 4中出现,在上面我们已经求出了1 2 4 的出现次数,因此同理可得0的出现次数
- 因为i在5 6 8 9中出现,在上面我们已经求出了5 6 8 的出现次数,因此同理可得9的出现次数
代码
class Solution {
public:string originalDigits(string s) {map<char,int> m;for (auto c:s) ++m[c];m['8']=m['g'];m['4']=m['u'];m['2']=m['w'];m['6']=m['x'];m['0']=m['z'];m['3']=m['h']-m['8'];m['7']=m['s']-m['6'];m['5']=m['f']-m['4'];m['1']=m['o']-m['0']-m['2']-m['4'];m['9']=m['i']-m['5']-m['6']-m['8'];string res;for (int i = 0; i < 10; ++i) {for (int j = 0; j < m['0'+i]; ++j) {res+=char ('0'+i);}}return res;}
};