using System.Collections.Generic;
static IList<int> FindAnagrams(string s, string p)
IList<int> result = new List<int>();
Dictionary<char, int> pMap = new Dictionary<char, int>();
Dictionary<char, int> windowMap = new Dictionary<char, int>();
if (pMap.ContainsKey(ch))
for (int i = 0; i < p.Length; i++)
if (windowMap.ContainsKey(ch))
if (IsAnagram(windowMap, pMap))
for (int i = p.Length; i < s.Length; i++)
if (windowMap.ContainsKey(addChar))
char removeChar = s[i - p.Length];
if (windowMap[removeChar] == 0)
windowMap.Remove(removeChar);
if (IsAnagram(windowMap, pMap))
result.Add(i - p.Length + 1);
static bool IsAnagram(Dictionary<char, int> map1, Dictionary<char, int> map2)
foreach (var kvp in map2)
if (!map1.ContainsKey(key) || map1[key] != count)
public static void Main()
IList<int> result = FindAnagrams(s, p);
Console.WriteLine("Indices of anagrams: []"+ string.Join(", ", result) );