Leecode:Number of Matching Subsequences(JS解答)
解题思路:这里采用桶排序的思路,先把words数组按照首字母进行分组,例如:[“a”,“bb”,“acd”,“ace”]=》 “a" : “a”,“acd”,“ace”; “b” : “bb”;
然后开始遍历s字符,如examper1中的s:
遍历到s【0】(“a”),words => “c” : “cd”,“ce”; “b” : “bb”;
遍历到s【1】(“b”),words => “c” : “cd”,“ce”; “b” : “b”;
遍历到s【2】(“c”),words => “d” : “d” ; “e” : “e”; “b” : “b”;
,
上代码:
function numMatchingSubseq(s: string, words: string[]): number {
let res = 0;
let mapArr:any[][] = new Array(26);
let sArr:string[] = s.split("");
for(let i = 0; i < mapArr.length; i++){
mapArr[i] = [];
}
for(let i = 0; i < words.length; i++){
let index = words[i].charAt(0).charCodeAt(0) - "a".charCodeAt(0);
mapArr[index].push(buildNode(words[i]));
}
for(let i = 0; i < sArr.length; i++){
let chooseIndex = sArr[i].charCodeAt(0) - "a".charCodeAt(0);
let tempArr = mapArr[chooseIndex];
mapArr[chooseIndex] = [];
for (let j = 0; j < tempArr.length; j++){
tempArr[j].index++;
if(tempArr[j].index == tempArr[j].val.length){
res++;
}else{
let newIndex = tempArr[j].val.charAt(tempArr[j].index).charCodeAt(0) - "a".charCodeAt(0);
mapArr[newIndex].push(tempArr[j])
}
}
tempArr = [];
}
return res;
function buildNode(val:string):any{
return {
val: val,
index: 0
}
}
};