423 从英文中重建数字

题目描述:
给定一个非空字符串,其中包含字母顺序打乱的英文单词表示的数字0-9。按升序输出原始的数字。
注意:
输入只包含小写英文字母。
输入保证合法并可以转换为原始的数字,这意味着像 “abc” 或 “zerone” 的输入是不允许的。
输入字符串的长度小于 50,000。

示例 1:
输入: “owoztneoer”
输出: “012” (zeroonetwo)

示例 2:
输入: “fviefuro”
输出: “45” (fourfive)

方法1:
主要思路:解题汇总
(1)先统计给定的字符串中各个字符的个数;
(2)由于字符串一定能够重建数字,则可以先根据各个数字对应的英文字母中某些字符的唯一性,逐步的将各个可能的唯一的数字构造出来即可;
(3)先唯一的能够确定的五个数字是:使用字符z确定zero,使用w确定two,使用u确定four,使用x确定six,使用g确定eight;
(4)然后将相关的字符的数量进行更新,之后可以再进一步的确定:使用o确定one,使用r确定three,使用f确定five,使用s确定seven,使用i确定nine;
(5)最后将确定的各个字符串连接起来即可;
(7)其实可以根据各个字符之间的相关性,优化一下步骤;

class Solution {
public:
    string originalDigits(string s) {
        vector<int> counts(26,0);
        for(char&ch:s){//统一各个字符的个数
            ++counts[ch-'a'];
        }
        vector<string> strs(10);
        //唯一确定的五个数,既通过字符z确定zero
        if(counts['z'-'a']!=0){
            strs[0]=string(counts['z'-'a'],'0');
            counts['e'-'a']-=counts['z'-'a'];
            counts['r'-'a']-=counts['z'-'a'];
            counts['o'-'a']-=counts['z'-'a'];
            counts['z'-'a']=0;
        }
        if(counts['w'-'a']!=0){//通过w确定two
            strs[2]=string(counts['w'-'a'],'2');
            counts['t'-'a']-=counts['w'-'a'];
            counts['o'-'a']-=counts['w'-'a'];
            counts['w'-'a']=0;
        }
        if(counts['u'-'a']!=0){//通过u确定four
            strs[4]=string(counts['u'-'a'],'4');
            counts['f'-'a']-=counts['u'-'a'];
            counts['o'-'a']-=counts['u'-'a'];
            counts['r'-'a']-=counts['u'-'a'];
            counts['u'-'a']=0;
        }
        if(counts['x'-'a']!=0){//通过x确定six
            strs[6]=string(counts['x'-'a'],'6');
            counts['s'-'a']-=counts['x'-'a'];
            counts['i'-'a']-=counts['x'-'a'];
            counts['x'-'a']=0;
        }
        if(counts['g'-'a']!=0){//通过g确定eight
            strs[8]=string(counts['g'-'a'],'8');
            counts['e'-'a']-=counts['g'-'a'];
            counts['i'-'a']-=counts['g'-'a'];
            counts['h'-'a']-=counts['g'-'a'];
            counts['t'-'a']-=counts['g'-'a'];
            counts['g'-'a']=0;
        }

        if(counts['o'-'a']!=0){//其他的o用完了,可以确定one
            strs[1]=string(counts['o'-'a'],'1');
            counts['n'-'a']-=counts['o'-'a'];
            counts['e'-'a']-=counts['o'-'a'];
            counts['o'-'a']=0;
        }
        if(counts['r'-'a']!=0){//其他的r用完了,可以确定three
            strs[3]=string(counts['r'-'a'],'3');
            counts['t'-'a']-=counts['r'-'a'];
            counts['h'-'a']-=counts['r'-'a'];
            counts['e'-'a']-=2*counts['r'-'a'];
            counts['r'-'a']=0;
        }
        if(counts['f'-'a']!=0){//其他的f用完了,可以确定five
            strs[5]=string(counts['f'-'a'],'5');
            counts['i'-'a']-=counts['f'-'a'];
            counts['v'-'a']-=counts['f'-'a'];
            counts['e'-'a']-=counts['f'-'a'];
            counts['f'-'a']=0;
        }
        if(counts['s'-'a']!=0){//其他s用完了,可以确定seven
            strs[7]=string(counts['s'-'a'],'7');
            counts['e'-'a']-=2*counts['s'-'a'];
            counts['v'-'a']-=counts['s'-'a'];
            counts['n'-'a']-=counts['s'-'a'];
            counts['s'-'a']=0;
        }
        if(counts['i'-'a']!=0){//其他的i用完了,可以确定nine
            strs[9]=string(counts['i'-'a'],'9');
            counts['n'-'a']-=2*counts['i'-'a'];
            counts['e'-'a']-=counts['i'-'a'];
            counts['i'-'a']=0;
        }
        string res;//将各个字符串连接起来
        for(string&str:strs){
            res+=str;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值