423. 从英文里重建数字

题目

难度:★★☆☆☆
类型:字符串
方法:数学

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。

注意:

输入只包含小写英文字母。
输入保证合法并可以转换为原始的数字,这意味着像 "abc" 或 "zerone" 的输入是不允许的。
输入字符串的长度小于 50,000。

示例

示例 1:

输入: "owoztneoer"

输出: "012" (zeroonetwo)
示例 2:

输入: "fviefuro"

输出: "45" (fourfive)

解答

这道题不难,需要统计每个单词乱序后出现的个数。思路是以字母数代替单词数。字母有两种,一种是单独出现在一个单词中的,另一种是在多个单词中使用过的。我们可以寻找哪些字母是独一无二的,以此来代表单词出现的次数。例如“z”只在“zero”中出现过,“w”只在“two”中出现过等等。优先计算含有独一无二字母的单词,对于那些所有字母都在别的单词中出现过的情况,我们可以尽可能选取那些最不经常出现的字母,减去在出现在其他单词中的单词个数即可。最终按照升序和单词个数将对应数字排列起来即可。

class Solution:
    def originalDigits(self, s: str) -> str:
        n0 = s.count('z')
        n2 = s.count('w')
        n4 = s.count('u')
        n8 = s.count('g')
        n6 = s.count('x')
        n3 = s.count('t') - n2 - n8
        n7 = s.count('s') - n6
        n1 = s.count('o') - n4 - n2 - n0
        n5 = s.count('v') - n7
        n9 = s.count('i') - n8 - n6 - n5
        return "".join((str(i) * n for i, n in enumerate(list(map(eval, ['n{}'.format(i) for i in range(10)])))))

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

你可能感兴趣的:(423. 从英文里重建数字)