方法一 个人方法:
先统计chars里每个字符出现的次数,再对words里每个字符串统计每个字符出现的字符,当:
1、字符串里出现chars里没有的字符
2、字符串里某个字符出现的次数大于该字符在chars里出现的次数
以上两种情况则不符合题意,其他的则为满足的单词,统计他们的长度并累加
var arr=[],arr2=[],flag=true,res=0
for(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=false
break
}
if(arr2[char]>0){
arr2[char]++
if(arr2[char]>arr[char]){
flag=false
break
}
}else{
arr2[char]=1
}
}
if(flag){
res+=word.length
}
flag=true
arr2=[]
}
return res
};
统计chars里字符的出现次数也可以用map():
var countCharacters = function(words, chars) {
var arr=[],flag=true,res=0
var 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=false
break
}
if(arr[char]>0){
arr[char]++
if(arr[char]>map.get(char)){
flag=false
break
}
}else{
arr[char]=1
}
}
if(flag){
res+=word.length
}
flag=true
arr=[]
}
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 = chars
for (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
};
消耗时间和内存情况: