😎풀이

  1. s1s2보다 긴 경우, s2로는 s1의 순열을 담을 수 없음
  2. 두 문자열의 알파벳 빈도 확인
  3. 슬라이딩 윈도우 기법으로 s2s1만큼의 길이를 탐색하며 빈도가 같은 경우 s1의 순열로 s2를 만들 수 있게 됨
  4. 빈도가 같은 구간이 존재하지 않는다면, 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])
}
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글