35 lines
1.1 KiB
C#
35 lines
1.1 KiB
C#
public class Solution
|
|
{
|
|
public IList<int> FindSubstring(string s, string[] words)
|
|
{
|
|
var len = words[0].Length;
|
|
var allLen = len * words.Length;
|
|
var dict = new Dictionary<string, int>();
|
|
foreach (var word in words)
|
|
{
|
|
dict.TryAdd(word, 0);
|
|
dict[word]++;
|
|
}
|
|
var answer = new List<int>();
|
|
var windowDict = new Dictionary<string, int>();
|
|
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;
|
|
}
|
|
} |