Leetcode/Top 100 Liked

[Sliding Window][Medium] 438. Find All Anagrams in a String

자전거통학 2024. 4. 19. 23:35

https://leetcode.com/problems/find-all-anagrams-in-a-string/description

 

Q. 두개의 string s와 p가 주어질 때, p의 anagram이 되는 s의 substring을 찾고, 그 시작 index 목록을 반환하라. 

 

 

Solution

 p에 대해 frequency buffer를 만들고 해당 버퍼를 모두 가진 구간이 있는지 확인한다. 

비교적 간단한 문제. 

 

코드.

더보기
public IList<int> FindAnagrams(string s, string p) 
{
    IList<int> ret = new List<int>();
    Dictionary<char, int> dictFreq = new Dictionary<char, int>();
    for(int q = 0; q < p.Length; ++q)
    {
        if(dictFreq.ContainsKey(p[q]))
            ++dictFreq[p[q]];
        else 
            dictFreq.Add(p[q], 1);
    }

    int left = 0;
    int right = 0;
    for(; right < s.Length; ++right) 
    {
        char cur = s[right];
        if(dictFreq.ContainsKey(cur))
            --dictFreq[cur];

        if(right-left+1 == p.Length)
        {
            bool hit = true;
            foreach(var keys in dictFreq.Keys) 
            {
                if(dictFreq[keys] != 0)
                {
                    hit = false;
                    break;
                }
            }
            if(hit) ret.Add(left);

            char leftOne = s[left++];
            if(dictFreq.ContainsKey(leftOne))
                ++dictFreq[leftOne];
        }
    }
    return ret;
}

 

 

적절한 결과를 얻었다.