diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 7637da7..781a3d7 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -217,4 +217,5 @@ mod p3133_minimum_array_end; mod p3145_find_products_of_elements_of_big_array; mod p3146_permutation_difference_between_two_strings; mod p698_partition_to_k_equal_sum_subsets; -mod p3134_find_the_median_of_the_uniqueness_array; \ No newline at end of file +mod p3134_find_the_median_of_the_uniqueness_array; +mod p3144_minimum_substring_partition_of_equal_character_frequency; \ No newline at end of file diff --git a/src/problem/p3144_minimum_substring_partition_of_equal_character_frequency.rs b/src/problem/p3144_minimum_substring_partition_of_equal_character_frequency.rs new file mode 100644 index 0000000..24da6e6 --- /dev/null +++ b/src/problem/p3144_minimum_substring_partition_of_equal_character_frequency.rs @@ -0,0 +1,49 @@ +/** + * [3144] Minimum Substring Partition of Equal Character Frequency + */ +pub struct Solution {} + + +// submission codes start here +use std::collections::HashMap; + +impl Solution { + pub fn minimum_substrings_in_partition(s: String) -> i32 { + let s: Vec = s.chars().collect(); + let n = s.len(); + + let mut dp = vec![i32::MAX;n + 1]; + let mut char_count = HashMap::new(); + dp[0] = 0; + + for i in 1..=n { + let mut max_count = 0; + char_count.clear(); + + for j in (1..=i).rev() { + let entry = char_count.entry(s[j - 1]).or_insert(0); + *entry += 1; + max_count = max_count.max(*entry); + + if max_count * char_count.len() == i - j + 1 && dp[j - 1] != i32::MAX { + dp[i] = dp[i].min(dp[j - 1] + 1); + } + } + } + + dp[n] + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_3144() { + assert_eq!(3, Solution::minimum_substrings_in_partition("fabccddg".to_owned())); + assert_eq!(2, Solution::minimum_substrings_in_partition("abababaccddb".to_owned())); + } +}