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;}
};