随机了一题
给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。
注意:每次拼写时,chars 中的每个字母都只能用一次。
返回词汇表 words 中你掌握的所有单词的 长度之和。
示例 1:
输入:words = ["cat","bt","hat","tree"], chars = "atach"
输出:6
解释:
可以形成字符串 "cat" 和 "hat",所以答案是 3 + 3 = 6。
示例 2:
输入:words = ["hello","world","leetcode"], chars = "welldonehoneyr"
输出:10
解释:
可以形成字符串 "hello" 和 "world",所以答案是 5 + 5 = 10。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
记录个很慢的解法
发现个事,在leecode不管用多少内存消耗,全部都是击败了100%的用户,但是执行用时还是可以参考下的
class Solution {
public int countCharacters(String[] words, String chars) {
/*
基本思路,
把String拆开,toCharArray
存到HashMap中,key存字母,value存字母出现的次数
然后拿数组中拆出的map到chars中拆出的map中getKye
最后统计下成功的单词数
*/
HashMap<Character,Integer> charM= toAsci(chars);
//存charM当前key的value
int count=0;
//判断foreach是否中途终止
boolean cou=true;
//在foreach中统计字母出现次数
int val=0;
//最终计数用来return的
int retur=0;
int wordsLength=words.length;
for(int i=0;i<wordsLength;i++){
HashMap<Character,Integer> wordM= toAsci(words[i]);
for(Map.Entry<Character,Integer> entry:wordM.entrySet()) {
count= charM.get(entry.getKey())==null?0:charM.get(entry.getKey());
;
if(count==0||count<entry.getValue()) {
cou=false;
continue;
}
charM.put(entry.getKey(),--count);
val+=entry.getValue();
}
if(cou) {
retur+=val;
}val=0;
cou=true;
charM= toAsci(chars);
}
return retur;
}
//把字符串拆成HashMap
public static HashMap<Character,Integer> toAsci(String chars){
char[] ch=chars.toCharArray();
HashMap<Character,Integer> hashM=new HashMap<Character,Integer>();
int chLength=ch.length;
for(int i=0;i<chLength;i++) {
int c= (hashM.get(ch[i])==null)?1:hashM.get(ch[i])+1;
hashM.put(ch[i],c);
}
return hashM;
}
}