carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode2103: Rings and Rods #339

Open carloscn opened 1 year ago

carloscn commented 1 year ago

Description

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:

The first character of the ith pair denotes the ith ring's color ('R', 'G', 'B'). The second character of the 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:

image

Input: rings = "B0B6G0R6R0R6G9" Output: 1 Explanation:

Example 2:

image

Input: rings = "B0R0G0R9R0B0G0" Output: 1 Explanation:

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).

carloscn commented 1 year ago

Analysis

pub fn count_points(rings: &str) -> i32
{
    let mut ret:i32 = 0;

    if rings.len() < 1 {
        return ret;
    }

    let mut i:usize = 0;
    let mut label:Vec<Vec<char>> = vec![vec![]; 10];
    let ring_color_vec:Vec<char> = rings.chars()
                                        .filter(|x| x.is_alphabetic())
                                        .collect();
    let ring_label_vec:Vec<char> = rings.chars()
                                        .filter(|x| x.is_numeric())
                                        .collect();
    while i < ring_color_vec.len() {
        label[(ring_label_vec[i] as u8 - '0' as u8) as usize].push(ring_color_vec[i]);
        i += 1;
    }

    for e in label {
        if e.contains(&'B') && e.contains(&'G') && e.contains(&'R') {
            ret += 1;
        }
    }

    return ret;
}
carloscn commented 1 year ago

Code

https://review.gerrithub.io/c/carloscn/structstudy/+/1168769 https://github.com/carloscn/structstudy/commit/d9deb61c3f8849141053af3a7987ab4a72a33ab1