方法一 个人方法:
先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当:
1、字符串里出现chars里没有的字符
2、字符串里某个字符出现的次数大于该字符在chars里出现的次数
以上两种情况则不符合题意,其他的则为满足的单词,统计他们的长度并累加
var arr=[],arr2=[],flag=true,res=0for(const char of chars){if(arr[char]>0){arr[char]++}else{arr[char]=1}}for(const word of words){for(const char of word){if(arr[char]===undefined){flag=falsebreak}if(arr2[char]>0){arr2[char]++if(arr2[char]>arr[char]){flag=falsebreak}}else{arr2[char]=1}}if(flag){res+=word.length}flag=truearr2=[]}return res
};
统计chars里字符的出现次数也可以用map():
var countCharacters = function(words, chars) {var arr=[],flag=true,res=0var map = new Map()for(const char of chars){map.has(char)? map.set(char,map.get(char)+1):map.set(char,1)}for(const word of words){for(const char of word){if(!map.has(char)){flag=falsebreak}if(arr[char]>0){arr[char]++if(arr[char]>map.get(char)){flag=falsebreak}}else{arr[char]=1}}if(flag){res+=word.length}flag=truearr=[]}return res
};
消耗时间和内存情况:
方法二
1、word要求由chars拼写且字符不能重复使用,那么word.length<=chars.length
2、chars不能被修改,但是可以创建chars的副本,可以修改副本来达到比较,匹配一个字符就在副本里删除一个字符,保证字符只能使用一次
var countCharacters = function (words, chars) {return words.filter( word => word.length <= chars.length).filter(word => {let c = charsfor (let i = 0; i < word.length; i++) {let w_s = word[i]let c_i = c.indexOf(w_s)if (c_i === -1) {return false} else {c = c.replace(w_s, '')continue}}return true}).join('').length
};
消耗时间和内存情况: