題目描述
這是 LeetCode 上的 423. 從英文中重建數字 ,難度為 中等。
Tag : 「模拟」、「腦筋急轉彎」
給你一個字元串
s
,其中包含字母順序打亂的用英文單詞表示的若幹數字
(0-9)
。按 升序 傳回原始的數字。
示例 1:
輸入:s = "owoztneoer"
輸出:"012"
示例 2:
輸入:s = "fviefuro"
輸出:"45"
提示:
-
為s[i]
這些字元之一["e","g","f","i","h","o","n","s","r","u","t","w","v","x","z"]
-
保證是一個符合題目要求的字元串s
模拟
題目要求我們将打亂的英文單詞重建為數字。
我們可以先對
s
進行詞頻統計,然後根據「英文單詞中的字元唯一性」确定建構的順序,最後再對答案進行排序即可。
具體的,
zero
中的
z
在其餘所有單詞中都沒出現過,我們可以先統計
zero
的出現次數,并建構 ;然後觀察剩餘數字,其中
eight
中的
g
具有唯一性,建構 ;再發現
six
中的
x
具有唯一性,建構 ;發現
three
中的
h
具有唯一性(利用在此之前
eight
已經被删除幹淨,詞頻中僅存在
three
對應的
h
),建構 ...
最終可以确定一個可行的建構序列為
0, 8, 6, 3, 2, 7, 5, 9, 4, 1
。
代碼:
class Solution {
static String[] ss = new String[]{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
static int[] priority = new int[]{0, 8, 6, 3, 2, 7, 5, 9, 4, 1};
public String originalDigits(String s) {
int n = s.length();
int[] cnts = new int[26];
for (int i = 0; i < n; i++) cnts[s.charAt(i) - 'a']++;
StringBuilder sb = new StringBuilder();
for (int i : priority) {
int k = Integer.MAX_VALUE;
for (char c : ss[i].toCharArray()) k = Math.min(k, cnts[c - 'a']);
for (char c : ss[i].toCharArray()) cnts[c - 'a'] -= k;
while (k-- > 0) sb.append(i);
}
char[] cs = sb.toString().toCharArray();
Arrays.sort(cs);
return String.valueOf(cs);
}
}
- 時間複雜度:令為最終答案的長度,為所有英文單詞的字元總長度。建構答案的複雜度為;對建構答案進行排序複雜度為。整體複雜度為
- 空間複雜度:
最後
這是我們「刷穿 LeetCode」系列文章的第
No.423
篇,系列開始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道題目,部分是有鎖題,我們将先把所有不帶鎖的題目刷完。