diff --git a/src/problem/mod.rs b/src/problem/mod.rs index a621879..ee87400 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -440,3 +440,5 @@ mod p3095_shortest_subarray_with_or_at_least_k_i; mod p3097_shortest_subarray_with_or_at_least_k_ii; mod p3287_find_the_maximum_sequence_value_of_array; + +mod p2266_count_number_of_texts; diff --git a/src/problem/p2266_count_number_of_texts.rs b/src/problem/p2266_count_number_of_texts.rs new file mode 100644 index 0000000..e3f2568 --- /dev/null +++ b/src/problem/p2266_count_number_of_texts.rs @@ -0,0 +1,92 @@ +/** + * [2266] Count Number of Texts + */ +pub struct Solution {} + +// submission codes start here +use std::collections::HashSet; + +const MODE: i64 = 1_000_000_007; + +impl Solution { + pub fn count_texts(pressed_keys: String) -> i32 { + let three_keys = HashSet::from(['2', '3', '4', '5', '6', '8']); + let pressed_keys: Vec = pressed_keys.chars().collect(); + + let mut three_dp = Vec::from([0, 1, 2, 4]); + let mut four_dp = Vec::from([0, 1, 2, 4, 8]); + + let mut get_three = |n: usize| { + if n >= three_dp.len() { + for i in three_dp.len()..=n { + three_dp.push((three_dp[i - 1] + three_dp[i - 2] + three_dp[i - 3]) % MODE); + } + } + + three_dp[n] + }; + + let mut get_four = |n: usize| { + if n >= four_dp.len() { + for i in four_dp.len()..=n { + four_dp.push( + (four_dp[i - 1] + four_dp[i - 2] + four_dp[i - 3] + four_dp[i - 4]) % MODE, + ); + } + } + + four_dp[n] + }; + + let mut last_key = None; + let mut count = 0; + let mut result = 1; + + for c in pressed_keys { + if let Some(last) = last_key { + if last == c { + count += 1; + } else { + if three_keys.contains(&last) { + result = result * get_three(count) % MODE; + } else { + result = result * get_four(count) % MODE; + } + + last_key = Some(c); + count = 1; + } + } else { + last_key = Some(c); + count = 1; + } + } + + if let Some(last) = last_key { + if three_keys.contains(&last) { + result = result * get_three(count) % MODE; + } else { + result = result * get_four(count) % MODE; + } + } + + result as i32 + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_2266() { + assert_eq!(3136, Solution::count_texts("444479999555588866".to_owned())); + assert_eq!(8, Solution::count_texts("22233".to_owned())); + assert_eq!( + 82876089, + Solution::count_texts("222222222222222222222222222222222222".to_owned()) + ); + } +}