423.从英文中重建数字

https://leetcode-cn.com/problems/reconstruct-original-digits-from-english/

首先统计每个字母分别在哪些数字中出现:

字母
数字

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

class Solution:
    def originalDigits(self, s: str) -> str:
        c = collections.Counter(s)	# 统计字母频率

        cnt = [0] * 10	#表示0-9每个数字出现次数
        # z, w, u, x, g 都只在一个数字中,即 0, 2, 4, 6, 8 中出现
        cnt[0] = c['z']
        cnt[2] = c['w']
        cnt[4] = c['u']
        cnt[6] = c['x']
        cnt[8] = c['g']
        # h 只在 3,8 中出现,知道8的次数就可推出3的次数
        # f 只在 4,5 中出现,知道4的次数就可推出5的次数
        # s 只在 6,7 中出现,知道6的次数就可推出7的次数
        cnt[3] = c['h'] - cnt[8]
        cnt[5] = c['f'] - cnt[4]
        cnt[7] = c['s'] - cnt[6]
        # o只在0,1,2,4中出现,知道0、2、4就可推出1
        cnt[1] = c['o'] - cnt[0] - cnt[2] - cnt[4]
        # 最后剩9,可以通过n、i、e字符求9的次数
        # n只在1,7,9中出现,但是n在9中出现2次
        # e只在0,1,3,5,7,8,9中出现,但是在3和7中出现2次,这种都会引起歧义
        # 因此选择i,只在5,6,8,9中出现,且都只出现一次,没有歧义
        cnt[9] = c['i'] - cnt[5] - cnt[6] - cnt[8]

        res = ""
        for i in range(10):
            res += str(i) * cnt[i]
        return res

最后更新于