1. 程式人生 > >Reconstruct Original Digits from English 從英文中重建數字

Reconstruct Original Digits from English 從英文中重建數字

給定一個非空字串,其中包含字母順序打亂的英文單詞表示的數字0-9。按升序輸出原始的數字。

注意:

  1. 輸入只包含小寫英文字母。
  2. 輸入保證合法並可以轉換為原始的數字,這意味著像 "abc" 或 "zerone" 的輸入是不允許的。
  3. 輸入字串的長度小於 50,000。

示例 1:

輸入: "owoztneoer"

輸出: "012" (zeroonetwo)

示例 2:

輸入: "fviefuro"

輸出: "45" (fourfive),

思路:由於給定的字串是無序的,且保證輸入是有效的,所以只要找到每一個數字的“獨特標識”即可(換句話說,每個數字只需要一個字母就可以唯一代替),那麼只要從0開始到9,統計各個唯一字母的次數就可以了。

具體如下圖所示,每個字母在所有子母中出現的次數統計:

先統計次數為1的,然後是2的,然後3,以此類推。。。

參考程式碼:

class Solution {
public:
string originalDigits(string s) {
	vector<int> counts(10, 0);
	for (char c : s) {
		if (c == 'z') counts[0]++;
		if (c == 'w') counts[2]++;
		if (c == 'g') counts[8]++;
		if (c == 'u') counts[4]++;
		if (c == 'x') counts[6]++;
		if (c == 's') counts[7]++; //7-6
		if (c == 'f') counts[5]++; //5-4
		if (c == 'h') counts[3]++; //3-8
		if (c == 'i') counts[9]++; //9-8-5-6
		if (c == 'o') counts[1]++; //1-0-2-4
	}
	counts[7] -= counts[6];
	counts[5] -= counts[4];
	counts[3] -= counts[8];
	counts[9] = counts[9]- counts[8] - counts[5] - counts[6];
	counts[1] = counts[1] - counts[0] - counts[2] - counts[4];
	string result = "";
	for (int i = 0; i < 10; i++) {
		while (counts[i] > 0) {
			result.push_back(i + '0');
			counts[i]--;
		}
	}
	return result;
}
};