Оптимально

This commit is contained in:
2026-03-26 00:22:10 +03:00
parent 4681660c8c
commit 3f3bc52106

View File

@@ -1,35 +1,34 @@
public class Solution { public class Solution
public IList<int> FindSubstring(string s, string[] words) { {
public IList<int> FindSubstring(string s, string[] words)
{
var len = words[0].Length; var len = words[0].Length;
var allLen = len*words.Length; var allLen = len * words.Length;
var dict = new Dictionary<string, int>(); var dict = new Dictionary<string, int>();
foreach(var word in words) foreach (var word in words)
{ {
dict.TryAdd(word, 0); dict.TryAdd(word, 0);
dict[word]++; dict[word]++;
} }
var answer = new List<int>(); var answer = new List<int>();
var dictClone = new Dictionary<string, int>(dict); var windowDict = new Dictionary<string, int>();
for(var i = 0; i < s.Length-allLen+1; i++) for (var offset = 0; offset < len; offset++)
{ {
var valid = 0; for (var i = offset; i <= s.Length-len; i += len)
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)]; var word = s[i..(i + len)];
if(dictClone.TryGetValue(word, out var count) && count > 0) var prevInx = i - allLen;
if (prevInx >= 0)
{ {
dictClone[word]--; var leftWord = s[prevInx..(prevInx + len)];
valid++; windowDict[leftWord]--;
}
else
{
break;
} }
windowDict.TryAdd(word, 0);
windowDict[word]++;
if (dict.All(kvp => windowDict.TryGetValue(kvp.Key, out var count) && count == kvp.Value))
answer.Add(prevInx + len);
} }
if(valid == words.Length) windowDict.Clear();
answer.Add(i);
} }
return answer; return answer;
} }