方法一 个人方法:
将words里的字符串的每个字符出现的次数都转为键值对的形式:
循环求两两键值对数组的交集:
最后的交集就是重复出现的字符和次数,把键值对转回字符数组形式即可
思路对了,但是太复杂了,时间效率很低
var commonChars = function(words) {
var arr=[],newWords=[],union=[]
for(var item of words){
for(var char of item){
if(!arr[char]){
arr[char]=1
}else{
arr[char]++
}
}
newWords.push(arr)
arr=[]
}
arr=newWords[0]
for(var i=1;i<newWords.length;i++){
for( char of words[i]){
if(arr[char]){
union[char]=arr[char]<=newWords[i][char]?arr[char]:newWords[i][char]
}
}
arr=union
union=[]
}
for(char in arr){
for(i=0;i<arr[char];i++){
union.push(char)
}
}
return union
};
消耗时间和内存情况:
?方法二? 参考大佬的:
直接使用第一项或最后一项作为对比模板,查询相同字母
需要注意,找到一个相同字母后,需要去除这个字母,才能进行下一个字母的对比
var commonChars = function(words) {
let father = words.pop().split("");
return father.filter(e=>{
let flag = words.every(item=>{
return item.indexOf(e) > -1;
});
if(flag) {
words = words.map(d=>{
return d.replace(e,'');
})
}
return flag;
});
};
消耗时间和内存情况: