There are n
rings and each ring is either red, green, or blue. The rings are distributed across ten rods labeled from 0
to 9
.
You are given a string rings
of length 2n
that describes the n
rings that are placed onto the rods. Every two characters in rings
forms a color-position pair that is used to describe each ring where:
ith
pair denotes the ith
ring's color ('R'
, 'G'
, 'B'
).ith
pair denotes the rod that the ith
ring is placed on ('0'
to '9'
).For example, "R3G2B1"
describes n == 3
rings: a red ring placed onto the rod labeled 3, a green ring placed onto the rod labeled 2, and a blue ring placed onto the rod labeled 1.
Return the number of rods that have all three colors of rings on them.
Example 1:
Input: rings = "B0B6G0R6R0R6G9" Output: 1 Explanation: - The rod labeled 0 holds 3 rings with all colors: red, green, and blue. - The rod labeled 6 holds 3 rings, but it only has red and blue. - The rod labeled 9 holds only a green ring. Thus, the number of rods with all three colors is 1.
Example 2:
Input: rings = "B0R0G0R9R0B0G0" Output: 1 Explanation: - The rod labeled 0 holds 6 rings with all colors: red, green, and blue. - The rod labeled 9 holds only a red ring. Thus, the number of rods with all three colors is 1.
Example 3:
Input: rings = "G4" Output: 0 Explanation: Only one ring is given. Thus, no rods have all three colors.
Constraints:
rings.length == 2 * n
1 <= n <= 100
rings[i]
where i
is even is either 'R'
, 'G'
, or 'B'
(0-indexed).rings[i]
where i
is odd is a digit from '0'
to '9'
(0-indexed).This problem asks us to find the number of rods that have all three colors (Red, Green, Blue) of rings. The input is a string representing the color and rod number of each ring.
The most efficient approach uses bit manipulation and a hash table (implicitly represented by an array in this case). We can represent the presence of each color on a rod using bits:
If a rod has all three colors, the bitwise OR of the colors will be 7 (binary 111 = 1 + 2 + 4).
We iterate through the input string, processing two characters at a time (color and rod number). For each ring, we update the bitmask for the corresponding rod. Finally, we count the number of rods with a bitmask of 7.
rings
string. We iterate through the string once.mask
) of size 10 to store the bitmasks for each rod. The size of the array is independent of the input size.class Solution:
def countPoints(self, rings: str) -> int:
mask = [0] * 10 # Array to store bitmasks for each rod (0-9)
d = {"R": 1, "G": 2, "B": 4} # Mapping of colors to bit values
for i in range(0, len(rings), 2): # Iterate through the string, 2 characters at a time
color = rings[i]
rod = int(rings[i + 1])
mask[rod] |= d[color] # Update the bitmask for the rod using bitwise OR
return mask.count(7) # Count the number of rods with all three colors (bitmask 7)
The implementations in other languages (Java, C++, Go, TypeScript, Rust, C) follow the same logic, adapting the syntax to each language's specific features. The core idea of bit manipulation and using an array for efficient lookup remains consistent. See the provided solutions in the original response for the code examples in these languages.
An alternative approach involves using three separate arrays (or dictionaries/maps) to track the presence of each color on each rod. Then you would need to check each rod individually to see if all three arrays have a True
value for that rod. This approach has a higher time complexity (O(N*10) in the worst case) because it requires multiple iterations through different data structures. The bit manipulation method is significantly more efficient.