每日一题——LeetCode1160.拼写单词

每日一题——LeetCode1160.拼写单词_第1张图片

方法一 个人方法:

先统计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
};

 消耗时间和内存情况:

每日一题——LeetCode1160.拼写单词_第2张图片

方法二 

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
};

消耗时间和内存情况:

每日一题——LeetCode1160.拼写单词_第3张图片

你可能感兴趣的:(每日一题,javascript,算法,leetcode)