Intuition
- In the worst case, each hamster needs one donut.
- However, in the case of H.H, two hamsters share 1 donut, meaning there is one less donut needed for each H.H case.
Complexity
Runtime
to do a bunch of string manipulation on a string of size N
Space
to store the resultant string.
Code
Tcarcus
if "HHH" in hamsters or hamsters[:2] == "HH" or hamsters[-2:] == "HH" or hamsters == "H":
return -1
return hamsters.count("H") - hamsters.count("H.H")Smartcoder
class Solution:
def minimumBuckets(self, hamsters: str) -> int:
n = len(hamsters)
if hamsters.count('H') == n or 'HHH' in hamsters or hamsters == 'H' or (n >= 2 and (hamsters[:2] == 'HH' or hamsters[-2:] == 'HH')):
return -1
h = list(hamsters)
ans = 0
for i in range(1, n-1):
if h[i-1] + h[i] + h[i+1] == 'H.H':
h[i-1] = 'X'
h[i] = 'X'
h[i+1] = 'X'
ans += 1
return ans + h.count('H')class Solution:
def minimumBuckets(self, hamsters: str) -> int:
n = len(hamsters)
if n == 1:
if hamsters[0] == 'H':
return -1
return 0
if n == 2:
if hamsters[0] == hamsters[1] == 'H':
return -1
elif hamsters[0] == hamsters[1] == '.':
return 0
return 1
hamsters = list(hamsters)
counter = Counter(hamsters)
if '.' in counter and counter['.'] == n:
return 0
# Check for HH on left or right (edge case)
if hamsters[0] == hamsters[1] == 'H' or hamsters[-1] == hamsters[-2] == 'H':
return -1
# Check for HHH
for right in range(2, n):
if hamsters[right - 2] == hamsters[right - 1] == hamsters[right] == 'H':
return -1
# Check for H.H
count = 0
left = 0
for right in range(2, n):
if hamsters[right - 2] == hamsters[right] == 'H':
hamsters[right - 1] = 'X'
hamsters[right - 2] = 'X'
hamsters[right] = 'X'
count += 1
return count + hamsters.count('H')Notes
References
Minimum Number of Food Buckets to Feed the Hamsters - LeetCode