풀이 방법
Anagram은 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것이다. 즉, 두 문장이 있을 때 문장을 이루는 각 문자의 갯수만 동일하면 두 문장은 아나그램으로 볼 수 있다.
예를 들어 “aabbab”와 “ababab”가 있을 때, “aabbab”는 ‘a’ 3개, ‘b’ 3개로 구성되어 있고, “ababab”도 ‘a’ 3개, ‘b’ 3개로 구성되어 있기 때문에 두 문장을 서로의 아나그램이다.
s 안에 p의 아나그램이 몇 개 있는지 확인하는 방법은 아래와 같다. 여기서 s는 “abcbccbb”, p는 “bbc”로 가정하도록 한다. s[a, b]는 s의 a ~ b까지의 문자로 구성된 문장을 표현한다.
- p[0, p.length() - 1]에 존재하는 소문자의 갯수를 카운트한다.
- s[0, p.length() - 1]에 존재하는 소문자의 갯수를 카운트한다.
- s[0, p.length() - 1]과 p[0, p.length() - 1]에 존재하는 소문자의 갯수가 같지 않으므로 s[0, p.length() - 1]은 p의 아나그램이 아니다.
- s[1, 1 + p.length() - 1]에 존재하는 소문자의 갯수를 카운트 해야 한다. 2단계에서 구해놓았던 것에서 s[0, 0]을 제외하고 s[1 + p.length() - 1, 1 + p.length() - 1]을 추가하면 된다.(Sliding Window)
- 3 과정을 반복한다.
- 4, 5 과정을 반복하며 아나그램인 경우 s의 시작 인덱스를 결과 목록에 추가한다.
코드