add new solutions
This commit is contained in:
parent
489fa73880
commit
0f5f9e331c
11 changed files with 539 additions and 0 deletions
35
solutions/37/q3713/solution.go
Normal file
35
solutions/37/q3713/solution.go
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
package q3713
|
||||
|
||||
func longestBalanced(s string) int {
|
||||
longest := 0
|
||||
cnt, tmp := [26]int{}, [26]int{}
|
||||
|
||||
for i := range len(s) {
|
||||
copy(cnt[:], tmp[:])
|
||||
distinct, imbal, maxCnt := 0, 0, 0
|
||||
|
||||
for j := i; j >= 0; j-- {
|
||||
c := s[j] - 'a'
|
||||
cnt[c]++
|
||||
if cnt[c] == 1 {
|
||||
distinct++
|
||||
imbal++
|
||||
}
|
||||
|
||||
if cnt[c] > maxCnt {
|
||||
maxCnt = cnt[c]
|
||||
imbal = distinct - 1
|
||||
} else if cnt[c] == maxCnt {
|
||||
imbal--
|
||||
}
|
||||
|
||||
if imbal == 0 {
|
||||
longest = max(longest, i-j+1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return longest
|
||||
}
|
||||
|
||||
var _ = longestBalanced
|
||||
88
solutions/37/q3714/solution.go
Normal file
88
solutions/37/q3714/solution.go
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
package q3714
|
||||
|
||||
func longestBalanced(s string) int {
|
||||
longest := 0
|
||||
single := 0
|
||||
diff3 := make(map[[2]int]int, len(s))
|
||||
diffAB, diffAC := 0, 0
|
||||
|
||||
diff2AB, diff2AC, diff2BC := map[int]int{}, map[int]int{}, map[int]int{}
|
||||
nDiff2AB, nDiff2AC, nDiff2BC := 0, 0, 0
|
||||
lastA, lastB, lastC := -1, -1, -1
|
||||
|
||||
for i := range len(s) {
|
||||
// Single
|
||||
if i > 0 && s[i] == s[i-1] {
|
||||
single++
|
||||
} else {
|
||||
single = 1
|
||||
}
|
||||
longest = max(longest, single)
|
||||
|
||||
// Dual
|
||||
var process2pair = func(diffIdx map[int]int, offset, i, diff int) int {
|
||||
if diff == 0 {
|
||||
return i - offset
|
||||
}
|
||||
if prev, ok := diffIdx[diff]; !ok {
|
||||
diffIdx[diff] = i
|
||||
return 0
|
||||
} else {
|
||||
return i - prev
|
||||
}
|
||||
}
|
||||
switch s[i] {
|
||||
case 'a':
|
||||
lastA = i
|
||||
nDiff2BC, diff2BC = 0, map[int]int{}
|
||||
nDiff2AB++
|
||||
nDiff2AC++
|
||||
t1 := process2pair(diff2AB, lastC, i, nDiff2AB)
|
||||
t2 := process2pair(diff2AC, lastB, i, nDiff2AC)
|
||||
longest = max(longest, t1, t2)
|
||||
|
||||
case 'b':
|
||||
lastB = i
|
||||
nDiff2AC, diff2AC = 0, map[int]int{}
|
||||
nDiff2AB--
|
||||
nDiff2BC++
|
||||
t1 := process2pair(diff2AB, lastC, i, nDiff2AB)
|
||||
t2 := process2pair(diff2BC, lastA, i, nDiff2BC)
|
||||
longest = max(longest, t1, t2)
|
||||
|
||||
case 'c':
|
||||
lastC = i
|
||||
nDiff2AB, diff2AB = 0, map[int]int{}
|
||||
nDiff2BC--
|
||||
nDiff2AC--
|
||||
t1 := process2pair(diff2BC, lastA, i, nDiff2BC)
|
||||
t2 := process2pair(diff2AC, lastB, i, nDiff2AC)
|
||||
longest = max(longest, t1, t2)
|
||||
}
|
||||
|
||||
// Triple
|
||||
switch s[i] {
|
||||
case 'a':
|
||||
diffAB++
|
||||
diffAC++
|
||||
case 'b':
|
||||
diffAB--
|
||||
case 'c':
|
||||
diffAC--
|
||||
}
|
||||
key := [2]int{diffAB, diffAC}
|
||||
if key == [2]int{0, 0} {
|
||||
longest = i + 1
|
||||
continue
|
||||
}
|
||||
if prev, ok := diff3[key]; !ok {
|
||||
diff3[key] = i
|
||||
} else {
|
||||
longest = max(longest, i-prev)
|
||||
}
|
||||
}
|
||||
|
||||
return longest
|
||||
}
|
||||
|
||||
var _ = longestBalanced
|
||||
53
solutions/37/q3719/solution.go
Normal file
53
solutions/37/q3719/solution.go
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
package q3719
|
||||
|
||||
var seen [6000]bool
|
||||
|
||||
func longestBalanced(nums []int) int {
|
||||
// Map numbers to reduce the range
|
||||
mapped := make(map[int]int, len(nums))
|
||||
nextEven, nextOdd := 0, 1
|
||||
for i := range nums {
|
||||
if m, ok := mapped[nums[i]]; ok {
|
||||
nums[i] = m
|
||||
} else if nums[i]%2 == 0 {
|
||||
mapped[nums[i]] = nextEven
|
||||
nums[i] = nextEven
|
||||
nextEven += 2
|
||||
} else {
|
||||
mapped[nums[i]] = nextOdd
|
||||
nums[i] = nextOdd
|
||||
nextOdd += 2
|
||||
}
|
||||
}
|
||||
numRange := max(nextEven, nextOdd)
|
||||
copy(seen[:3000], seen[3000:]) // init
|
||||
|
||||
longest := 0
|
||||
for i := 1; i < len(nums); i++ {
|
||||
copy(seen[:numRange], seen[numRange:]) // reset
|
||||
odd, even := 0, 0
|
||||
for j := i; j >= 0; j-- {
|
||||
num := nums[j]
|
||||
if seen[num] {
|
||||
if even == odd {
|
||||
longest = max(longest, i-j+1)
|
||||
}
|
||||
continue
|
||||
}
|
||||
seen[num] = true
|
||||
|
||||
if num%2 == 0 {
|
||||
even++
|
||||
} else {
|
||||
odd++
|
||||
}
|
||||
if even == odd {
|
||||
longest = max(longest, i-j+1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return longest
|
||||
}
|
||||
|
||||
var _ = longestBalanced
|
||||
Loading…
Add table
Add a link
Reference in a new issue