rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;
use std::collections::HashMap;

impl Solution {
    fn palindrome_partition(s: String, k: i32) -> i32 {
        let s: Vec<char> = s.chars().collect();
        let n = s.len();
        let k = k as usize;
        let mut memo: HashMap<(usize, usize, usize), i32> = HashMap::new();
        let res = Self::dp(0, n, k, &mut memo, &s);
        dbg!(memo);
        res
    }

    fn dp(
        start: usize,
        end: usize,
        k: usize,
        memo: &mut HashMap<(usize, usize, usize), i32>,
        s: &[char],
    ) -> i32 {
        if k == end - start {
            return 0;
        }

        if let Some(&res) = memo.get(&(start, end, k)) {
            return res;
        }

        let res = if k == 1 {
            let n = end - start;
            s[start..end]
                .iter()
                .zip(s[start..end].iter().rev())
                .take(n / 2)
                .map(|v| if v.0 == v.1 { 0 } else { 1 })
                .sum()
        } else {
            let mut min = std::i32::MAX;
            for i in start + 1..=end - k + 1 {
                min = min.min(Self::dp(start, i, 1, memo, s) + Self::dp(i, end, k - 1, memo, s));
            }
            min
        };
        memo.insert((start, end, k), res);
        res
    }
}

#[test]
fn test() {
    let s = "abc".to_string();
    let k = 2;
    let res = 1;
    assert_eq!(Solution::palindrome_partition(s, k), res);
    let s = "aabbc".to_string();
    let k = 3;
    let res = 0;
    assert_eq!(Solution::palindrome_partition(s, k), res);
    let s = "leetcode".to_string();
    let k = 8;
    let res = 0;
    assert_eq!(Solution::palindrome_partition(s, k), res);
}