From 3f3bc52106a221aa30038c6a27517a159d93504b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Thu, 26 Mar 2026 00:22:10 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Solution.cs | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/30. Substring with Concatenation of All Words/Solution.cs b/30. Substring with Concatenation of All Words/Solution.cs index 2ec9574..afabd4d 100644 --- a/30. Substring with Concatenation of All Words/Solution.cs +++ b/30. Substring with Concatenation of All Words/Solution.cs @@ -1,35 +1,34 @@ -public class Solution { - public IList FindSubstring(string s, string[] words) { +public class Solution +{ + public IList FindSubstring(string s, string[] words) + { var len = words[0].Length; - var allLen = len*words.Length; + var allLen = len * words.Length; var dict = new Dictionary(); - foreach(var word in words) + 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 windowDict = new Dictionary(); + for (var offset = 0; offset < len; offset++) { - var valid = 0; - foreach (var kvp in dictClone) - dictClone[kvp.Key] = dict[kvp.Key]; - for(var j=i; j < i+allLen; j+=len) + for (var i = offset; i <= s.Length-len; i += len) { - var word = s[j..(j+len)]; - if(dictClone.TryGetValue(word, out var count) && count > 0) + var word = s[i..(i + len)]; + var prevInx = i - allLen; + if (prevInx >= 0) { - dictClone[word]--; - valid++; - } - else - { - break; + 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); } - if(valid == words.Length) - answer.Add(i); + windowDict.Clear(); } return answer; }