public class Solution { public IList FindSubstring(string s, string[] words) { var len = words[0].Length; var allLen = len * words.Length; var dict = new Dictionary(); foreach (var word in words) { dict.TryAdd(word, 0); dict[word]++; } var answer = new List(); var windowDict = new Dictionary(); for (var offset = 0; offset < len; offset++) { for (var i = offset; i <= s.Length-len; i += len) { var word = s[i..(i + len)]; var prevInx = i - allLen; if (prevInx >= 0) { var leftWord = s[prevInx..(prevInx + len)]; windowDict[leftWord]--; } windowDict.TryAdd(word, 0); windowDict[word]++; if (dict.All(kvp => windowDict.TryGetValue(kvp.Key, out var count) && count == kvp.Value)) answer.Add(prevInx + len); } windowDict.Clear(); } return answer; } }