leetcode423.从英文中重建数字

题目大意

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

注意:

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

示例 1:

输入: "owoztneoer"

输出: "012" (zeroonetwo)

示例 2:

输入: "fviefuro"

输出: "45" (fourfive)

解题思路

先统计给定字符串中每个字符的出现频率,然后分别计算每个数字出现的次数。

例如:0(zero),在0~9的英文单词中,只有zero中有’z’这个单词,因此字符串中有多少个’z’,就有多少个数字0。 6(six),只有six中有’x’这个单词,因此有多少个’x’就有多少个数字6。以此类推即可。

class Solution {
private:
	string dup(int num, int count){
		string tmp;
		for (int i = 0; i < count; ++i)
			tmp += to_string(num);
		return tmp;
	}
public:
    string originalDigits(string s) {
    	if (s.empty())
    		return "";

    	map<char, int> dict;
    	for (int i = 0; i < s.size(); ++i)
    		++dict[s[i]];

	    int s0 = dict['z'];
	    int s6 = dict['x'];
	    int s7 = dict['s'] - s6;
	    int s5 = dict['v'] - s7;
	    int s4 = dict['u'];
	    int s3 = dict['r'] - s4 - s0;
	    int s8 = dict['g'];
	    int s9 = dict['i'] - s5 - s6 - s8;
	    int s2 = dict['w'];
	    int s1 = dict['o'] - s0 - s2 - s4;

	    vector<int> nums{s0, s1, s2, s3, s4, s5, s6, s7, s8, s9};

	    string res;

	    for (int i = 0; i < nums.szie(); ++i){
	    	res += dup(i, nums[i]);
	    }
	    return res;
	}
};

猜你喜欢

转载自blog.csdn.net/qq_41092190/article/details/106420735