feat: osvijrsi
This commit is contained in:
95
pkg/minimum_window_substring/main.go
Normal file
95
pkg/minimum_window_substring/main.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package minimumwindowsubstring
|
||||
|
||||
import "fmt"
|
||||
|
||||
type Set[T comparable] map[T]int
|
||||
|
||||
type Substring struct {
|
||||
Main string
|
||||
Left int
|
||||
Right int
|
||||
Set Set[byte]
|
||||
}
|
||||
|
||||
func Better(a, b string) string {
|
||||
if len(a) == 0 {
|
||||
return b
|
||||
} else if len(b) < len(a) {
|
||||
return b
|
||||
}
|
||||
|
||||
return a
|
||||
}
|
||||
|
||||
func NewSubstring(s string) Substring {
|
||||
return Substring{s, 0, len(s) - 1, NewSet(s)}
|
||||
}
|
||||
|
||||
func (s Set[T]) SubsetOf(t Set[T]) bool {
|
||||
for k := range s {
|
||||
if s[k] > t[k] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func NewSet(t string) Set[byte] {
|
||||
set := Set[byte]{}
|
||||
for i := range t {
|
||||
set[t[i]]++
|
||||
}
|
||||
|
||||
return set
|
||||
}
|
||||
|
||||
func (s *Substring) CullLeft(t Substring) {
|
||||
for s.Set[s.Main[s.Left]] > t.Set[s.Main[s.Left]] {
|
||||
s.Set[s.Main[s.Left]]--
|
||||
s.Left++
|
||||
}
|
||||
|
||||
fmt.Println("CANNOT CULL", string(s.Main[s.Left]))
|
||||
}
|
||||
|
||||
func (s *Substring) IncRight() bool {
|
||||
if s.Right == len(s.Main)-1 {
|
||||
return false
|
||||
}
|
||||
|
||||
s.Right++
|
||||
s.Set[s.Main[s.Right]]++
|
||||
return true
|
||||
}
|
||||
|
||||
func (s Substring) String() string {
|
||||
return s.Main[s.Left : s.Right+1]
|
||||
}
|
||||
|
||||
func (s *Substring) CullRight(t Substring) {
|
||||
for s.Set[s.Main[s.Right]] > t.Set[s.Main[s.Right]] {
|
||||
s.Set[s.Main[s.Right]]--
|
||||
s.Right--
|
||||
}
|
||||
}
|
||||
|
||||
func minWindow(s string, t string) string {
|
||||
ss, tt := NewSubstring(s), NewSubstring(t)
|
||||
best_answer := ""
|
||||
|
||||
if !tt.Set.SubsetOf(ss.Set) {
|
||||
return best_answer
|
||||
}
|
||||
|
||||
ss.CullRight(tt)
|
||||
ss.CullLeft(tt)
|
||||
best_answer = Better(best_answer, ss.String())
|
||||
|
||||
for ss.IncRight() {
|
||||
ss.CullLeft(tt)
|
||||
best_answer = Better(best_answer, ss.String())
|
||||
}
|
||||
|
||||
return best_answer
|
||||
}
|
||||
Reference in New Issue
Block a user