
😎풀이
s1이 s2보다 긴 경우, s2로는 s1의 순열을 담을 수 없음
- 두 문자열의 알파벳 빈도 확인
- 슬라이딩 윈도우 기법으로
s2의 s1만큼의 길이를 탐색하며 빈도가 같은 경우 s1의 순열로 s2를 만들 수 있게 됨
- 빈도가 같은 구간이 존재하지 않는다면,
false 반환
function checkInclusion(s1: string, s2: string): boolean {
const s1Len = s1.length
const s2Len = s2.length
if(s1Len > s2Len) return false
const s1Freq = Array.from({ length: 26 }, () => 0)
const s2Freq = Array.from({ length: 26 }, () => 0)
for(let i = 0; i < s1Len; i++) {
s1Freq[s1.charCodeAt(i) - 97]++
s2Freq[s2.charCodeAt(i) - 97]++
}
if(isAllSame(s1Freq, s2Freq)) return true
for(let i = s1Len; i < s2Len; i++) {
s2Freq[s2.charCodeAt(i) - 97]++
s2Freq[s2.charCodeAt(i - s1Len) - 97]--
if(isAllSame(s1Freq, s2Freq)) return true
}
return false
};
function isAllSame(arr1: number[], arr2: number[]) {
return arr1.every((num, idx) => num === arr2[idx])
}