"Substring With Concatenation of all words" hard task No 30 accepted solution

This commit is contained in:
2022-04-20 16:42:03 +03:00
parent b2d11b6826
commit 9ebb71d76f
2 changed files with 85 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
package main
import (
"bytes"
"encoding/json"
)
func FindSubstring(s string, words []string) []int {
res := []int{}
numWords := len(words)
strLen := len(s)
if numWords == 0 || strLen == 0 {
return res
}
wordMapOriginal := map[string]int{}
for _, w := range words {
wordMapOriginal[w]++
}
jsonWordMapOriginal, _ := json.Marshal(wordMapOriginal)
wordSz := len(words[0])
wndSz := numWords * wordSz
for i := 0; i <= strLen-wndSz; i++ {
j := 0
wordMap := map[string]int{}
for j = i; j < i+wndSz; j += wordSz {
word := s[j : j+wordSz]
_, ok := wordMapOriginal[word]
if !ok {
break
} else {
wordMap[word]++
}
}
if j == i+wndSz {
jsonWordMap, _ := json.Marshal(wordMap)
if bytes.Compare(jsonWordMap, jsonWordMapOriginal) == 0 {
res = append(res, i)
}
}
}
return res
}

View File

@@ -0,0 +1,33 @@
package main
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestFindSubstring128(t *testing.T) {
words := []string{"word", "good", "best", "good"}
expected := []int{8}
res := FindSubstring("wordgoodgoodgoodbestword", words)
assert.Equal(t, expected, res)
}
func TestFindSubstring0(t *testing.T) {
words := []string{"foo", "bar"}
expected := []int{0, 9}
res := FindSubstring("barfoothefoobarman", words)
assert.Equal(t, expected, res)
}
func TestFindSubstring1(t *testing.T) {
words := []string{"word", "good", "best", "word"}
expected := []int{}
res := FindSubstring("wordgoodgoodgoodbestword", words)
assert.Equal(t, expected, res)
}
func TestFindSubstring2(t *testing.T) {
words := []string{"bar", "foo", "the"}
expected := []int{6, 9, 12}
res := FindSubstring("barfoofoobarthefoobarman", words)
assert.Equal(t, expected, res)
}