foolish fly fox's blog
--Stay hungry, stay foolish.
--Forever young, forever weeping.
https://leetcode.com/problems/reconstruct-original-digits-from-english/description/
Given a non-empty string containing an out-of-order English representation of digits 0-9
, output the digits in ascending order.
Note:
Example 1:
Input: "owoztneoer"
Output: "012"
Example 2:
Input: "fviefuro"
Output: "45"
使用动态规划方式求解。但是在输入非常大时,迭代的层数会非常多,空间复杂度会非常大。
class Solution(object): def recursive_f(self, letters): if len(letters)==0: return True, '' for s_digit, counter in self.record: for letter in counter: if counter[letter]>letters[letter]: break else: r,v = self.recursive_f(letters-counter) if r: return True, s_digit+v else: return False, None def originalDigits(self, s): """ :type s: str :rtype: str """ from collections import Counter self.record = [(n,Counter(v)) for n,v in zip(list('0123456789'), ['zero','one','two','three','four','five', 'six','seven','eight','nine'])] letters = Counter(s) r, v = self.recursive_f(letters) return v
根据题目特性,比如:在 0~9 对应的字母中,只有 0(zero) 有 z
, 因此可以先求出 0 的个数,以此类推可以大大加快求解效率。
class Solution(object): def originalDigits(self, s): """ :type s: str :rtype: str """ from collections import Counter record = [0]*10 letters = Counter(s) items = [(0, 'z', 'zero'), (6, 'x', 'six'), (2, 'w', 'two'), (8, 'g', 'eight'), (3, 'h', 'three'), (4, 'u', 'four'), (5, 'f', 'five'), (1, 'o', 'one'), (9, 'i', 'nine'), (7, 's', 'seven')] for n, flag, word in items: if letters[flag]: record[n] += letters[flag] v = letters[flag] for letter in word: letters[letter] -= v return ''.join([str(i)*v for i,v in enumerate(record)])