AC golang
180
Sep 22, 2021
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
}
Comments (0)