Files
phishingclub/backend/vendor/github.com/ysmood/got/lib/lcs/utils.go
T
Ronni Skansing f5e6f53d75 update vendor
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
2026-05-24 09:57:07 +02:00

65 lines
1.2 KiB
Go

package lcs
import (
"strings"
)
func min(x, y int) int {
if x < y {
return x
}
return y
}
func eq(x, y Comparable) bool {
return x.String() == y.String()
}
// String interface
func (xs Sequence) String() string {
if len(xs) == 0 {
return ""
}
l := 0
for _, el := range xs {
l += len(el.String())
}
if l == len(xs) {
out := ""
for _, c := range xs {
out += c.String()
}
return out
}
out := []string{}
for _, c := range xs {
out = append(out, c.String())
}
return strings.Join(out, "\n")
}
// StandardLCS implementation for testing purpose only, because it's very inefficient.
// https://en.wikipedia.org/wiki/Longest_common_subsequence_problem#LCS_function_defined.
func StandardLCS(xs, ys Sequence) Sequence {
last := func(s Sequence) Comparable {
return s[len(s)-1]
}
noLast := func(s Sequence) Sequence {
return s[:len(s)-1]
}
if len(xs)*len(ys) == 0 {
return Sequence{}
} else if last(xs).String() == last(ys).String() {
return append(StandardLCS(noLast(xs), noLast(ys)), last(xs))
}
left, right := StandardLCS(xs, noLast(ys)), StandardLCS(noLast(xs), ys)
if len(left) > len(right) {
return left
}
return right
}