LeetCode1160.拼寫單詞(Java+暴力+HashMap)
題目
給你一份『詞彙表』(字串陣列) words 和一張『字母表』(字串) chars。 假如你可以用 chars 中的『字母』(字元)拼寫出 words 中的某個『單詞』(字串),那麼我們就認為你掌握了這個單詞。
注意:每次拼寫(指拼寫詞彙表中的一個單詞)時,chars 中的每個字母都只能用一次。 返回詞彙表 words 中你掌握的所有單詞的 長度之和。
輸入:words = [“cat”,“bt”,“hat”,“tree”],
chars = “atach”
輸出:6
解釋 可以形成字串 “cat” 和 “hat”,所以答案是 3 + 3 = 6。
方法一:暴力解
主要是處理“chars 中的每個字母都只能用一次”
// 三重迴圈,太慢了
static public int countCharacters(String[] words, String chars) {
int sum = 0;
HashSet<Integer> set = new HashSet<>();
for (String str : words) {
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < chars.length(); j++) {
if (set.contains(j)) {
continue;
} else {
if (str.charAt(i) == chars.charAt(j)) {
set.add(j);
break;
}
}
}
}
if (set.size() == str.length()) {
sum += set.size();
}
set.clear();
}
return sum;
}
方法二:HashMap
設兩個HashMap,分別儲存每個字串的字元數量,然後進行比較大小
static public int countCharacters2(String[] words, String chars) {
// 前面字元,後面個數
HashMap<Character, Integer> map = new HashMap<>();// 放chars
HashMap<Character, Integer> mapOfArray = new HashMap<>();// 放words
int sum = 0;
// 先放chars
for (int i = 0; i < chars.length(); i++) {
map.put(chars.charAt(i), map.getOrDefault(chars.charAt(i), 0) + 1);
}
for (String str : words) {
for (int i = 0; i < str.length(); i++) {
mapOfArray.put(str.charAt(i), mapOfArray.getOrDefault(str.charAt(i), 0) + 1);
}
boolean flag = true;
// 改進
// for (int i = 0; i < str.length(); i++) {
// if (!map.containsKey(str.charAt(i))||map.get(str.charAt(i)) <
// mapOfArray.get(str.charAt(i))) {
// flag = false;
// }
// }
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (map.getOrDefault(temp, 0) < mapOfArray.getOrDefault(temp, 0)) {
flag = false;
break;
}
}
if (flag) {
sum += str.length();
}
mapOfArray.clear();
}
return sum;
}
發現
程式碼1:
for (int i = 0; i < str.length(); i++) {
if (!map.containsKey(str.charAt(i)) || map.get(str.charAt(i)) < mapOfArray.get(str.charAt(i))) {
flag = false;
}
}
程式碼2:
for (int i = 0; i < str.length(); i++) {
char temp = str.charAt(i);
if (map.getOrDefault(temp, 0) < mapOfArray.getOrDefault(temp, 0)) {
flag = false;
break;
}
}
程式碼1VS程式碼2:程式碼2 會快很多!!
原因是:map.get(str.charAt(i)),要執行:str先取出第i個字元,再給map去查詢,會慢很多。
所以先設定一個temp變數,儲存字元,用temp去代替map.get中的str.charAt()。
比較兩個map個value,可以用getOrDefault()方法來進行比較。
反思
多思考啊!!加油呀
相關文章
- PHPstrom 取消單詞拼寫錯誤的提示PHP
- java 英文單詞拼寫糾正框架(Word Checker)Java框架
- leetcode刷題之1160拼寫單詞 java題解(超詳細)LeetCodeJava
- 基於海量詞庫的單詞拼寫檢查、推薦到底是咋做的?
- 單詞拼寫糾正-05-2452.力扣 距離字典兩次編輯距離以內的單詞力扣
- 單詞拼寫糾正-04-161.力扣 相隔為 1 的編輯距離力扣
- 英文單詞縮寫----DXNRY – Dictionary 字典
- 程式設計師寫簡歷時的技術詞彙拼寫規範備忘錄程式設計師
- 拼多多API:拼多多獲得搜尋詞統計 APIAPI
- 程式設計師寫簡歷時必須注意的技術詞彙拼寫(持續更新...)程式設計師
- 拼多多API:拼多多根據關鍵詞取商品列表 APIAPI
- webstorm(二):拼寫warningWebORM
- 超簡單整合ML kit 實現聽寫單詞播報
- 為了收集和整理程式設計的常用單詞,我寫了個背單詞應用程式設計
- 真實的描寫暴力,讓我們真實地痛恨著暴力
- 單詞
- idea取消拼寫檢查Idea
- vscode配置拼寫檢查VSCode
- Linux中常用的命令都是哪些單詞的縮寫?Linux
- 拼多多按關鍵詞查詢商品APIAPI
- 拼多多獲得搜尋詞推薦 APIAPI
- 手寫 Java HashMap 核心原始碼JavaHashMap原始碼
- 拼多多買兩單免一單是真的嗎?拼多多免單操作步驟
- 簡單的 HashMap 實現HashMap
- Python將所有的英文單詞首字母變成大寫Python
- 如何用 Linux 幫助你拼寫Linux
- 單詞拆分
- webpack單詞Web
- elasticsearch拼寫糾錯之Term SuggesterElasticsearch
- java+藍芽Java藍芽
- Java+泛型Java泛型
- HashMap設計原理與實現(下篇)200行帶你寫自己的HashMap!!!HashMap
- LeetCode 單詞拆分LeetCode
- 單詞劃分
- 四級單詞
- 單詞遊戲遊戲
- 0625+單詞
- 0628+單詞