rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

use std::cmp::Reverse;
use std::collections::BinaryHeap;

impl Solution {
    fn find_rotate_steps(ring: String, key: String) -> i32 {
        let n = ring.len();
        let m = key.len();
        let ring: Vec<char> = ring.chars().collect();
        let key: Vec<char> = key.chars().collect();
        let mut queue: BinaryHeap<(Reverse<i32>, usize, usize)> = BinaryHeap::new();
        let mut dist = vec![vec![std::i32::MAX; n]; m];
        queue.push((Reverse(0), 0, 0));
        while let Some((Reverse(step), i, size)) = queue.pop() {
            if size == m {
                return step;
            }
            for j in 0..n {
                if ring[j] == key[size] {
                    let d = step + Self::rotate(i as i32, j as i32, n as i32) + 1;
                    if d < dist[size][j] {
                        dist[size][j] = d;
                        queue.push((Reverse(d), j, size + 1));
                    }
                }
            }
        }
        0
    }

    fn rotate(i: i32, j: i32, n: i32) -> i32 {
        let left = i - j;
        let right = j - i;
        let left = if left < 0 { left + n } else { left };
        let right = if right < 0 { right + n } else { right };
        left.min(right)
    }
}

#[test]
fn test() {
    let ring = "godding".to_string();
    let key = "gd".to_string();
    let res = 4;
    assert_eq!(Solution::find_rotate_steps(ring, key), res);
}