423. 从英文中重建数字 : 脑筋急转弯模拟题

简介: 423. 从英文中重建数字 : 脑筋急转弯模拟题

网络异常,图片无法展示
|


题目描述



这是 LeetCode 上的 423. 从英文中重建数字 ,难度为 中等


Tag : 「模拟」、「脑筋急转弯」


给你一个字符串 s ,其中包含字母顺序打乱的用英文单词表示的若干数字(0-9)。按 升序 返回原始的数字。


示例 1:


输入:s = "owoztneoer"
输出:"012"
复制代码


示例 2:


输入:s = "fviefuro"
输出:"45"
复制代码


提示:


  • 1 <= s.length <= 10^51<=s.length<=105
  • s[i]["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"] 这些字符之一
  • s 保证是一个符合题目要求的字符串


模拟



题目要求我们将打乱的英文单词重建为数字。


我们可以先对 s 进行词频统计,然后根据「英文单词中的字符唯一性」确定构建的顺序,最后再对答案进行排序即可。


具体的,zero 中的 z 在其余所有单词中都没出现过,我们可以先统计 zero 的出现次数,并构建 00;然后观察剩余数字,其中 eight 中的 g 具有唯一性,构建 88;再发现 six 中的 x 具有唯一性,构建 66;发现 three 中的 h 具有唯一性(利用在此之前 eight 已经被删除干净,词频中仅存在 three 对应的 h),构建 33 ...


最终可以确定一个可行的构建序列为 0, 8, 6, 3, 2, 7, 5, 9, 4, 1


代码:


class Solution {
    static String[] ss = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    static int[] priority = new int[]{0, 8, 6, 3, 2, 7, 5, 9, 4, 1};
    public String originalDigits(String s) {
        int n = s.length();
        int[] cnts = new int[26];
        for (int i = 0; i < n; i++) cnts[s.charAt(i) - 'a']++;
        StringBuilder sb = new StringBuilder();
        for (int i : priority) {
            int k = Integer.MAX_VALUE;
            for (char c : ss[i].toCharArray()) k = Math.min(k, cnts[c - 'a']);
            for (char c : ss[i].toCharArray()) cnts[c - 'a'] -= k;
            while (k-- > 0) sb.append(i);
        }
        char[] cs = sb.toString().toCharArray();
        Arrays.sort(cs);
        return String.valueOf(cs);
    }
}
复制代码


  • 时间复杂度:令 mm 为最终答案的长度,LL 为所有英文单词的字符总长度。构建答案的复杂度为 O(L + m)O(L+m);对构建答案进行排序复杂度为 O(m\log{m})O(mlogm)。整体复杂度为 O(m\log{m})O(mlogm)
  • 空间复杂度:O(L + m)O(L+m)


最后



这是我们「刷穿 LeetCode」系列文章的第 No.423 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。


在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。


为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:github.com/SharingSour…


在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。

相关文章
英文捡贝壳
记录生活中的英语,“不积跬步无以至千里”
|
物联网 机器人 智能硬件
数字商圈有什么用?江湖之中武林之外有三位高人这么说……
数字商圈有什么用?江湖之中武林之外有三位高人这么说……
181 0
|
自然语言处理
每日一题——验证外星语词典
每日一题——验证外星语词典
91 0
每日一题——验证外星语词典
|
算法
日拱算法:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
|
自然语言处理
LeetCode每日一题——953. 验证外星语词典
某种外星语也使用英文小写字母,但可能顺序 order 不同。字母表的顺序(order)是一些小写字母的排列。
123 0
|
存储 算法 Java
字符作画,我用字符画个冰墩墩
字符作画,我用字符画个冰墩墩
256 0
字符作画,我用字符画个冰墩墩
L1-007 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5:
149 0
|
XML 数据采集 数据可视化
如果EXCEL有段位,你会是什么水平?网友:我竟然只是青铜
EXCEL是我们工作中最常见的办公软件,但是要熟练掌握EXCEL也并非是一件易事,就好比是玩王者荣耀一样,从青铜到王者必须要一步步往上爬,不经历风雨,怎么见彩虹。今天对EXCEL的等级水平作进行简单的介绍,快来测试一下你的EXCEL水平究竟在哪个段位,看看你是大神还是小白!
如果EXCEL有段位,你会是什么水平?网友:我竟然只是青铜
|
前端开发 算法 小程序
280字编程挑战:把一条推特长度的代码玩出花
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 推特与计算机能擦出什么样的火花呢?大多数人可能就想到在计算机上发推特呗。但是,有人就不这么想。酷爱计算机演进史和推特的 Dominic Pajak 创建了 BBC Micro Bot,它能够将一条 280 字符的推特经过模拟处理进而创建 3 秒时长的视频。
280字编程挑战:把一条推特长度的代码玩出花
|
算法 数据处理 开发者
笔试算法模拟题精解之“变化的字符”
把所有数据处理一遍再求一遍最大值即可。
笔试算法模拟题精解之“变化的字符”