Programming & Development / April 10, 2025

LeetCode 299: Bulls and Cows โ€“ Guessing the Secret Number with Bulls and Cows

LeetCode 299 Bulls and Cows number guessing game string comparison bulls cows exact match partial match Python problem-solving

Introduction

LeetCode 299: Bulls and Cows is a problem that simulates a number guessing game where you are given a secret number and a guess, and you need to return how many bulls and cows there are in the guess relative to the secret number.

  • Bulls: The number of digits that are exactly correct (both value and position).
  • Cows: The number of digits that are correct but in the wrong position.

This problem tests your ability to perform string comparison and efficiently count exact matches and partial matches.

Problem Statement

You are playing a number guessing game with a secret number and a guess. Each digit in the guess can either match exactly (bull) or match in value but not position (cow).
Write a function that takes the secret and guess as inputs and returns the number of bulls and cows in the guess compared to the secret.
Bulls: Correct digit and position. Cows: Correct digit but wrong position.

Example

python

Input:
secret = "1807"
guess = "7810"

Output:
"1A3B"

Explanation:
- 1 bull: digit "8" is in the correct position.
- 3 cows: digits "7", "1", "0" are in the wrong position but correct digits.

โœ… Step-by-Step Solution

๐Ÿง  Intuition

The problem can be broken down into two parts:

  1. Count the bulls: This is straightforward. We can iterate over the secret and guess strings and count the number of positions where the characters are the same.
  2. Count the cows: This requires a bit more thought. After counting the bulls, we need to track how many digits are in the guess that are also in the secret, but in different positions. We can do this by keeping track of the frequency of each digit in the secret and guess strings.

โœ… Approach

  1. Count Bulls:
  • Iterate through both secret and guess. If the digits at the same position match, increment the bulls count.
  • Keep track of the unmatched digits from both secret and guess in two separate lists.
  1. Count Cows:
  • After counting the bulls, for the remaining unmatched digits, check how many digits in the guess appear in secret but not in the same position.
  • Use dictionaries (or collections.Counter) to count the frequency of each unmatched digit in secret and guess and then calculate how many cows there are by comparing these frequencies.
  1. Return the Result:
  • Format the output as a string: "XAYB", where X is the number of bulls and Y is the number of cows.

โœ… Python Code

python

from collections import Counter

class Solution:
    def getHint(self, secret: str, guess: str) -> str:
        bulls = 0
        cows = 0
        secret_unmatched = []
        guess_unmatched = []
        
        # Step 1: Count bulls and collect unmatched digits
        for i in range(len(secret)):
            if secret[i] == guess[i]:
                bulls += 1
            else:
                secret_unmatched.append(secret[i])
                guess_unmatched.append(guess[i])
        
        # Step 2: Count cows using frequency counts of unmatched digits
        secret_counter = Counter(secret_unmatched)
        guess_counter = Counter(guess_unmatched)
        
        # Cows are the minimum count of matching digits between secret and guess
        for digit in guess_counter:
            if digit in secret_counter:
                cows += min(secret_counter[digit], guess_counter[digit])
        
        return f"{bulls}A{cows}B"

๐Ÿงช How It Works

  1. Counting Bulls:
  • We iterate through each character of secret and guess using a for loop.
  • If the digits at the same index match (secret[i] == guess[i]), we increment the bulls count.
  • For unmatched digits, we store them in separate lists: secret_unmatched and guess_unmatched.
  1. Counting Cows:
  • After counting the bulls, we use collections.Counter to count the frequency of unmatched digits in both secret_unmatched and guess_unmatched.
  • For each digit in guess_unmatched, if it exists in secret_unmatched, we count how many times it appears in both lists. The number of cows is the sum of the minimum frequencies of each digit that appears in both lists.
  1. Formatting the Output:
  • Finally, we return the result in the format "XAYB", where X is the number of bulls and Y is the number of cows.

โฑ๏ธ Time and Space Complexity

MetricValueTime ComplexityO(n), where n is the length of the secret and guess strings. We iterate through the strings once to count bulls and cows, and then use counters to count the frequency of digits in the unmatched lists.Space ComplexityO(n), where n is the length of the strings. We store unmatched digits in separate lists and use counters for frequency counts.

  • Time Complexity: We iterate over both the secret and guess strings once to count bulls, and then we process the unmatched characters using counters. Thus, the time complexity is O(n), where n is the length of the strings.
  • Space Complexity: We use additional lists to store unmatched digits and counters to track the frequency of unmatched digits. The space complexity is O(n), where n is the length of the strings.

๐Ÿ” Edge Cases

  1. Both Strings are the Same:
  • If the secret and guess are identical, then all characters will be bulls, and cows will be zero.
  1. All Cows, No Bulls:
  • If the guess contains all the correct digits but in the wrong order, then the number of bulls will be zero, but the number of cows will reflect the number of correct digits.
  1. No Matches (No Bulls or Cows):
  • If there are no common digits between the secret and guess, then both bulls and cows will be zero.
  1. Empty Strings:
  • While not explicitly mentioned in the problem statement, empty strings would imply no bulls and no cows.

โœ… Conclusion

LeetCode 299: Bulls and Cows is a number guessing game where you need to find the exact matches (bulls) and partial matches (cows) between a guess and a secret number. The solution utilizes simple string comparison and counting techniques to efficiently compute the result.

By iterating over both strings to count bulls and then using frequency counters for cows, this solution ensures that we efficiently calculate the number of bulls and cows in O(n) time, where n is the length of the strings.


Comments

No comments yet

Add a new Comment

NUHMAN.COM

Information Technology website for Programming & Development, Web Design & UX/UI, Startups & Innovation, Gadgets & Consumer Tech, Cloud Computing & Enterprise Tech, Cybersecurity, Artificial Intelligence (AI) & Machine Learning (ML), Gaming Technology, Mobile Development, Tech News & Trends, Open Source & Linux, Data Science & Analytics

Categories

Tags

©{" "} Nuhmans.com . All Rights Reserved. Designed by{" "} HTML Codex