# 423. Reconstruct Original Digits from English

## Description

Given a string s containing an out-of-order English representation of digits 0-9, return the digits in ascending order.

Example 1:

Input: s = "owoztneoer"
Output: "012"


Example 2:

Input: s = "fviefuro"
Output: "45"


Constraints:

• 1 <= s.length <= 105
• s[i] is one of the characters ["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"].
• s is guaranteed to be valid.

## Solutions

• class Solution {
public String originalDigits(String s) {
int[] counter = new int[26];
for (char c : s.toCharArray()) {
++counter[c - 'a'];
}
int[] cnt = new int[10];
cnt[0] = counter['z' - 'a'];
cnt[2] = counter['w' - 'a'];
cnt[4] = counter['u' - 'a'];
cnt[6] = counter['x' - 'a'];
cnt[8] = counter['g' - 'a'];

cnt[3] = counter['h' - 'a'] - cnt[8];
cnt[5] = counter['f' - 'a'] - cnt[4];
cnt[7] = counter['s' - 'a'] - cnt[6];

cnt[1] = counter['o' - 'a'] - cnt[0] - cnt[2] - cnt[4];
cnt[9] = counter['i' - 'a'] - cnt[5] - cnt[6] - cnt[8];

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; ++i) {
for (int j = 0; j < cnt[i]; ++j) {
sb.append(i);
}
}
return sb.toString();
}
}

• class Solution {
public:
string originalDigits(string s) {
vector<int> counter(26);
for (char c : s) ++counter[c - 'a'];
vector<int> cnt(10);
cnt[0] = counter['z' - 'a'];
cnt[2] = counter['w' - 'a'];
cnt[4] = counter['u' - 'a'];
cnt[6] = counter['x' - 'a'];
cnt[8] = counter['g' - 'a'];

cnt[3] = counter['h' - 'a'] - cnt[8];
cnt[5] = counter['f' - 'a'] - cnt[4];
cnt[7] = counter['s' - 'a'] - cnt[6];

cnt[1] = counter['o' - 'a'] - cnt[0] - cnt[2] - cnt[4];
cnt[9] = counter['i' - 'a'] - cnt[5] - cnt[6] - cnt[8];

string ans;
for (int i = 0; i < 10; ++i)
for (int j = 0; j < cnt[i]; ++j)
ans += char(i + '0');
return ans;
}
};

• class Solution:
def originalDigits(self, s: str) -> str:
counter = Counter(s)
cnt = [0] * 10

cnt[0] = counter['z']
cnt[2] = counter['w']
cnt[4] = counter['u']
cnt[6] = counter['x']
cnt[8] = counter['g']

cnt[3] = counter['h'] - cnt[8]
cnt[5] = counter['f'] - cnt[4]
cnt[7] = counter['s'] - cnt[6]

cnt[1] = counter['o'] - cnt[0] - cnt[2] - cnt[4]
cnt[9] = counter['i'] - cnt[5] - cnt[6] - cnt[8]

return ''.join(cnt[i] * str(i) for i in range(10))


• func originalDigits(s string) string {
counter := make([]int, 26)
for _, c := range s {
counter[c-'a']++
}
cnt := make([]int, 10)
cnt[0] = counter['z'-'a']
cnt[2] = counter['w'-'a']
cnt[4] = counter['u'-'a']
cnt[6] = counter['x'-'a']
cnt[8] = counter['g'-'a']

cnt[3] = counter['h'-'a'] - cnt[8]
cnt[5] = counter['f'-'a'] - cnt[4]
cnt[7] = counter['s'-'a'] - cnt[6]

cnt[1] = counter['o'-'a'] - cnt[0] - cnt[2] - cnt[4]
cnt[9] = counter['i'-'a'] - cnt[5] - cnt[6] - cnt[8]

ans := []byte{}
for i, c := range cnt {
ans = append(ans, bytes.Repeat([]byte{byte('0' + i)}, c)...)
}
return string(ans)
}