아나그램 부분 문자열
설명
두 개의 문자열 s0
과 s1
가 주어지면 s1
에 s0
의 애너그램이 포함된 부분 문자열의 수를 반환합니다.
제약:
n ≤ 100,000
여기서 n
는 s0
의 길이입니다.m ≤ 100,000
여기서 m
는 s1
의 길이입니다.예 1
입력
s0 = "abc"
s1 = "bcabxabc"
산출
3
설명
The substrings "bca", "cab" and "abc" of s0 are permutations of "abc".
직관
시간 창
구현
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;
}
}
시간 복잡도
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;
}
}
Reference
이 문제에 관하여(아나그램 부분 문자열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jiangwenqi/anagram-substrings-jpi텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)