题目
给你一份『词汇表』(字符串数组) 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()方法来进行比较。
反思
多思考啊!!加油呀