var dict = map[rune]rune {
'c' : 'r',
'r' : 'o',
'o' : 'a',
'a' : 'k',
}
func minNumberOfFrogs(croakOfFrogs string) int {
if len(croakOfFrogs) == 0 {
return 0
}
croakMap := make(map[rune]int) // Croak -> Expected Count
var freeFrogs, totalFrogs int = 1, 1
for _, croak := range croakOfFrogs {
if croak == 'c' {
if isNewFrog(croakMap, freeFrogs, totalFrogs) {
totalFrogs++
} else {
freeFrogs--
}
incrementMap('r', croakMap)
continue
}
if !isCroakExpected(croak, croakMap) {
return -1
}
decrementMap(croak, croakMap)
if croak == 'k' {
freeFrogs++
} else {
incrementMap(dict[croak], croakMap)
}
}
for _, v := range croakMap {
if v != 0 {
return -1
}
}
return totalFrogs
}
func incrementMap(r rune, croakMap map[rune]int) {
if value, ok := croakMap[r]; ok {
croakMap[r] = value + 1
} else {
croakMap[r] = 1
}
}
func decrementMap(r rune, croakMap map[rune]int) {
croakMap[r]--
}
func isCroakExpected(r rune, croakMap map[rune]int) bool {
if value, ok := croakMap[r]; !ok || value == 0 {
return false
}
return true
}
func isNewFrog(croakMap map[rune]int, freeFrogs, totalFrogs int) bool {
if freeFrogs == 0 {
return true
}
return false
}