1
2
3
4
5 package lcs
6
7
8
9
10 type sequences interface {
11 lengths() (int, int)
12 commonPrefixLen(ai, aj, bi, bj int) int
13 commonSuffixLen(ai, aj, bi, bj int) int
14 }
15
16
17
18 type bytesSeqs struct{ a, b []byte }
19
20 func (s bytesSeqs) lengths() (int, int) { return len(s.a), len(s.b) }
21 func (s bytesSeqs) commonPrefixLen(ai, aj, bi, bj int) int {
22 return commonPrefixLen(s.a[ai:aj:aj], s.b[bi:bj:bj])
23 }
24 func (s bytesSeqs) commonSuffixLen(ai, aj, bi, bj int) int {
25 return commonSuffixLen(s.a[ai:aj:aj], s.b[bi:bj:bj])
26 }
27
28 type runesSeqs struct{ a, b []rune }
29
30 func (s runesSeqs) lengths() (int, int) { return len(s.a), len(s.b) }
31 func (s runesSeqs) commonPrefixLen(ai, aj, bi, bj int) int {
32 return commonPrefixLen(s.a[ai:aj:aj], s.b[bi:bj:bj])
33 }
34 func (s runesSeqs) commonSuffixLen(ai, aj, bi, bj int) int {
35 return commonSuffixLen(s.a[ai:aj:aj], s.b[bi:bj:bj])
36 }
37
38 type linesSeqs struct{ a, b []string }
39
40 func (s linesSeqs) lengths() (int, int) { return len(s.a), len(s.b) }
41 func (s linesSeqs) commonPrefixLen(ai, aj, bi, bj int) int {
42 return commonPrefixLen(s.a[ai:aj], s.b[bi:bj])
43 }
44 func (s linesSeqs) commonSuffixLen(ai, aj, bi, bj int) int {
45 return commonSuffixLen(s.a[ai:aj], s.b[bi:bj])
46 }
47
48
49
50
51
52
53 func commonPrefixLen[T comparable](a, b []T) int {
54 n := min(len(a), len(b))
55 i := 0
56 for i < n && a[i] == b[i] {
57 i++
58 }
59 return i
60 }
61
62
63 func commonSuffixLen[T comparable](a, b []T) int {
64 n := min(len(a), len(b))
65 i := 0
66 for i < n && a[len(a)-1-i] == b[len(b)-1-i] {
67 i++
68 }
69 return i
70 }
71
View as plain text