1
0
Fork 0
mirror of https://gitlab.com/mfocko/LeetCode.git synced 2024-11-10 00:09:06 +01:00
LeetCode/go/number-of-atoms.go

93 lines
1.6 KiB
Go
Raw Normal View History

package main
import (
"fmt"
"slices"
"strconv"
"unicode"
)
func countOfAtoms(formula string) string {
var stack []map[string]int
stack = append(stack, make(map[string]int))
i := 0
for i < len(formula) {
if formula[i] == '(' {
stack = append(stack, make(map[string]int))
i++
} else if formula[i] == ')' {
count := stack[len(stack)-1]
stack = stack[:len(stack)-1]
i++
j := i
for j < len(formula) && unicode.IsDigit(rune(formula[j])) {
j++
}
multiplier := 1
if i < j {
parsedMultiplier, err := strconv.ParseInt(formula[i:j], 10, 0)
if err != nil {
panic(err)
}
multiplier = int(parsedMultiplier)
}
i = j
parent := stack[len(stack)-1]
for element, count := range count {
parent[element] += count * multiplier
}
} else {
j := i + 1
for j < len(formula) && unicode.IsLower(rune(formula[j])) {
j++
}
element := formula[i:j]
i = j
for j < len(formula) && unicode.IsDigit(rune(formula[j])) {
j++
}
count := 1
if i < j {
parsedCount, err := strconv.ParseInt(formula[i:j], 10, 0)
if err != nil {
panic(err)
}
count = int(parsedCount)
}
i = j
parent := stack[len(stack)-1]
parent[element] += count
}
}
finalCount := stack[0]
elements := make([]string, len(finalCount))
for element := range finalCount {
elements = append(elements, element)
}
slices.Sort(elements)
answer := ""
for _, element := range elements {
answer += element
count := finalCount[element]
if count > 1 {
answer += fmt.Sprintf("%d", count)
}
}
return answer
}