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()方法來進行比較。
反思
多思考啊!!加油呀
相關文章
- 用 Python 做單詞拼寫檢查Python
- java 英文單詞拼寫糾正框架(Word Checker)Java框架
- PHPstrom 取消單詞拼寫錯誤的提示PHP
- 基於海量詞庫的單詞拼寫檢查、推薦到底是咋做的?
- leetcode刷題之1160拼寫單詞 java題解(超詳細)LeetCodeJava
- 二叉搜尋樹應用-判斷一個單詞是否拼寫正確,實現簡單字典
- Linux英文單詞縮寫Linux
- 如何解決資料庫分詞的拼寫糾正問題-PostgreSQLHunspell字典複數形容詞動詞等變異還原資料庫分詞SQL
- webstorm(二):拼寫warningWebORM
- 超簡單整合ML kit 實現聽寫單詞播報
- python PyEnchant(拼寫檢查)Python
- idea取消拼寫檢查Idea
- js將英文單詞首字母大寫效果JS
- CoffeeScript攻略3.6:大寫單詞首字母
- 為了收集和整理程式設計的常用單詞,我寫了個背單詞應用程式設計
- 單詞
- java 、HashMap 和單例JavaHashMap單例
- 單詞小卡片 -- 從單詞、例句收集到命令式背單詞
- 如何用 Linux 幫助你拼寫Linux
- vscode配置拼寫檢查VSCode
- javascript實現文字拼寫動畫效果JavaScript動畫
- 去除ckeditor裡的拼寫檢查
- 手寫 Java HashMap 核心原始碼JavaHashMap原始碼
- 簡單的 HashMap 實現HashMap
- webpack單詞Web
- 單詞拆分
- 單詞遊戲遊戲
- Linux中常用的命令都是哪些單詞的縮寫?Linux
- 請問 Go 的 fmt 是什麼單詞的縮寫?Go
- CSS如何將單詞首字母設定為大寫CSS
- 用Python寫一個簡單的中文分詞器Python中文分詞
- elasticsearch拼寫糾錯之Term SuggesterElasticsearch
- 怎樣寫一個拼寫檢查器(Python 版)Python
- Java+泛型Java泛型
- java+藍芽Java藍芽
- Python將所有的英文單詞首字母變成大寫Python
- 10:單詞排序排序
- android 單詞Android