"Substring With Concatenation of all words" hard task No 30 accepted solution
This commit is contained in:
52
30-substring-with-concatenation-of-all-words.go
Normal file
52
30-substring-with-concatenation-of-all-words.go
Normal 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
|
||||||
|
}
|
||||||
33
30-substring-with-concatenation-of-all-words_test.go
Normal file
33
30-substring-with-concatenation-of-all-words_test.go
Normal 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)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user