아나그램 부분 문자열

설명



두 개의 문자열 s0s1 가 주어지면 s1s0 의 애너그램이 포함된 부분 문자열의 수를 반환합니다.

제약:
  • n ≤ 100,000 여기서 ns0의 길이입니다.
  • m ≤ 100,000 여기서 ms1의 길이입니다.

  • 예 1



    입력




    s0 = "abc"
    s1 = "bcabxabc"
    


    산출




    3
    


    설명




    The substrings "bca", "cab" and "abc" of s0 are permutations of "abc".
    





    직관



    시간 창


  • 창의 길이는 s0과 같습니다
  • 그래서 우리는 두 개의 배열을 초기화할 수 있습니다. 하나는 s0용이고 다른 하나는 s1용입니다
  • .
  • 그런 다음 s1의 창을 단계별로 이동하여 s0의 창과 비교합니다
  • .

    구현




    import java.util.*;
    
    class Solution {
        public int solve(String s0, String s1) {
            int m = s0.length(), n = s1.length();
            if (m > n) {
                return 0;
            }
            int[] freq0 = new int[26], freq1 = new int[26];
            for (int i = 0; i < m; i++) {
                freq0[s0.charAt(i) - 'a']++;
                freq1[s1.charAt(i) - 'a']++;
            }
    
            int ans = 0;
            if (Arrays.equals(freq0, freq1)) {
                ans++;
            }
    
            for (int i = m; i < n; i++) {
                freq1[s1.charAt(i) - 'a']++;
                freq1[s1.charAt(i - m) - 'a']--;
                if (Arrays.equals(freq0, freq1)) {
                    ans++;
                }
            }
    
            return ans;
        }
    }
    


    시간 복잡도


  • 시간: O(M*N)
  • 스페이스: O(1)
  • 좋은 웹페이지 즐겨찾기