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 dictClone = new Dictionary(dict); for(var i = 0; i < s.Length-allLen+1; i++) { var valid = 0; foreach (var kvp in dictClone) dictClone[kvp.Key] = dict[kvp.Key]; for(var j=i; j < i+allLen; j+=len) { var word = s[j..(j+len)]; if(dictClone.TryGetValue(word, out var count) && count > 0) { dictClone[word]--; valid++; } else { break; } } if(valid == words.Length) answer.Add(i); } return answer; } }