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 原题链接和其他优选题解。

相关文章
|
2月前
|
算法
刘谦春晚纸牌魔术背后的数学—海明码原理简介
刘谦春晚纸牌魔术背后的数学—海明码原理简介
|
6月前
|
存储 算法 索引
【算法挨揍日记】day07——904. 水果成篮、438. 找到字符串中所有字母异位词
题目描述: 你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而,农场的主人设定了
321 0
|
9月前
|
人工智能 自然语言处理 数据处理
【每周一坑】单词本 +【解答】三国演义中谁的存在感最强
今天本系列打算做个小小的尝试,不再是一个单独的题目,而是一个连环坑!我希望通过之后的三四期,逐步引导大家做出一个功能较完整的小工具。不过我现在没有底,不知道到最后能有多少人把坑给填完。愿意接受挑战的,现在就开始了!
|
9月前
|
数据采集 存储 人工智能
【每周一坑】自动翻译 | 【解答】单词本
提示:翻译功能可以通过网上的翻译 API 实现,你所要了解的就是如何发起网络请求,以及如果对返回结果进行处理。这也算是基本的爬虫操作。
|
11月前
|
算法 C++ Python
【每日算法Day 68】脑筋急转弯:只要一行代码,但你会证吗?
【每日算法Day 68】脑筋急转弯:只要一行代码,但你会证吗?
|
11月前
002. PAT甲级真题1005 :拼写正确(002)
1. to_string()函数:将数字转换为字符串。 2. 数字字符 - ' 0 ' = 该数字
59 0
|
算法
日拱算法:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
|
机器学习/深度学习
移动字母(蓝桥杯—12年困难题)
移动字母(蓝桥杯—12年困难题)
73 0
|
数据安全/隐私保护 索引
力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文
力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文
力扣刷题记录——804. 唯一摩尔斯密码词、806. 写字符串需要的行数、824. 山羊拉丁文
|
算法 Python
【完虐算法】「字符串-最长公共前缀」5种方法脑洞大开
最近在专题制作过程中遇到了**最长前缀公共子串**的问题,也是读者最近校招面试到的一个题目。为什么拿出这个来说呢? 可怕的是,他居然给了 5 种解题方法。 更可怕的是,因此他直接少了一轮面试,天哪!!
338 0