【Leetcode】423. Reconstruct Original Digits from English

题目地址:

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

给定一个长 n n n字符串 s s s,其是若干数字的英文小写单词连接在一起并且打乱顺序所得,要求将其还原为数字组成的字符串,并且数字按升序排列。题目保证答案存在。

我们可以观察哪些字母只在某个数字中出现,然后逐个求出每个数字出现了多少次。先开个哈希表存一下 s s s中每个字母出现了多少次。接着,例如,'z'只在 0 0 0中出现,可以通过看 s s s中有多少个'z'知道 0 0 0有多少个;接着从哈希表中删去 0 0 0的每个字母的所有出现次数,例如'g'只在 8 8 8中出现,和上面一样可以知道 8 8 8有多少个,以此类推。代码如下:

class Solution {
 public:
  string originalDigits(string s) {
    string ss[] = {"zero", "one", "two",   "three", "four",
                   "five", "six", "seven", "eight", "nine"};
    int num[] = {0, 8, 3, 2, 6, 4, 5, 1, 7, 9};
    unordered_map<char, int> mp;
    map<char, int> mp2;
    for (char c : s) mp[c]++;
    string res;
    for (int x : num) {
      int cnt = INT_MAX;
      for (char c : ss[x]) cnt = min(cnt, mp[c]);
      if (!cnt) continue;
      mp2[x + '0'] = cnt;
      for (char c : ss[x]) mp[c] -= cnt;
    }
    for (auto &[k, v] : mp2) res += string(v, k);
    return res;
  }
};

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值