I am working on LeetCode problem 438. Find All Anagrams in a String:
Given two strings
sandp, return an array of all the start indices ofp's anagrams ins. You may return the answer in any order.
sandpconsist of lowercase English letters.
My Approach
I store the frequency of each character in an array and use a sliding window.
1. Using a global array declaration
let arr:number[]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // outside any function
function check(arr1:number[],arr2:number[]):boolean{
for (let i=0;i<26;i++){
if (arr1[i]!=arr2[i]){
return false;
}
}
return true;
}
function findAnagrams(s: string, p: string): number[] {
let ans:number[]=[],
lengthP:number=p.length,
lengthS:number=s.length,
j:number=0;
if (lengthP>lengthS){
return ans;
}
let arrP:number[]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for (let chr of p){
arrP[chr.charCodeAt(0)-97]++;
}
for (let i=0;i<lengthP;i++){
arr[s[i].charCodeAt(0)-97]++;
}
if (check(arr,arrP)){
ans.push(0);
}
for (let i=lengthP;i<lengthS;i++){
arr[s[j].charCodeAt(0)-97]--;
arr[s[i].charCodeAt(0)-97]++;
j++;
if (check(arr,arrP)){
ans.push(j);
}
}
return ans;
};
2. Using a functional scope array declaration
function check(arr1:number[],arr2:number[]):boolean{
for (let i=0;i<26;i++){
if (arr1[i]!=arr2[i]){
return false;
}
}
return true;
}
function findAnagrams(s: string, p: string): number[] {
let arr:number[]=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // inside function
let ans:number[]=[],
lengthP:number=p.length,
lengthS:number=s.length,
j:number=0;
if (lengthP>lengthS){
return ans;
}
let arrP:number[]= [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
for (let chr of p){
arrP[chr.charCodeAt(0)-97]++;
}
for (let i=0;i<lengthP;i++){
arr[s[i].charCodeAt(0)-97]++;
}
if (check(arr,arrP)){
ans.push(0);
}
for (let i=lengthP;i<lengthS;i++){
arr[s[j].charCodeAt(0)-97]--;
arr[s[i].charCodeAt(0)-97]++;
j++;
if (check(arr,arrP)){
ans.push(j);
}
}
return ans;
};
The problem
The first one is giving the wrong answer on some test cases, but the second one is 100% correct.
Is this really happening because of the way arr is declared?
If Yes, then am I missing something about local and global declaration in Typescript?