文章目录
- 题目描述
- 题解思路
- 题解代码
- 题目链接
题目描述
题解思路
这题可以先求按了多少次相同连续的按钮,所有的连续相同按钮表示的方案数的乘积就是本题答案
我们的关键问题就转换成了按n个连续相同按钮表示的方案数
设f(i)表示按i个连续相同按钮表示的方案数
- 如果按钮是三个字符的
f(i) = f(i - 1) + f(i - 2) + f(i - 3) - 如果按钮是四个字符的
f(i) = f(i - 1) + f(i - 2) + f(i - 3) + f(i - 4)
题解代码
impl Solution {
pub fn count_texts(pressed_keys: String) -> i32 {
let pressed_keys = pressed_keys.as_bytes();
let n = pressed_keys.len();
let mut f3 = vec![0; (n + 1).max(5)];
let mut f4 = vec![0; (n + 1).max(5)];
(f3[1], f3[2], f3[3], f3[4], f4[1], f4[2], f4[3], f4[4]) = (1, 2, 4, 7, 1, 2, 4, 8);
for i in 5..=n {
f3[i] = (f3[i - 1] + f3[i - 2] + f3[i - 3]) % 1000000007;
f4[i] = (f4[i - 1] + f4[i - 2] + f4[i - 3] + f4[i - 4]) % 1000000007;
}
let mut c = 1;
let mut ans = 1usize;
for i in 1..n {
if pressed_keys[i] == pressed_keys[i - 1] {
c += 1;
} else {
match pressed_keys[i - 1] {
b'7' | b'9' => {
ans *= f4[c];
}
_ => {
ans *= f3[c];
}
}
c = 1;
ans %= 1000000007;
}
}
match pressed_keys[n - 1] {
b'7' | b'9' => {
ans *= f4[c];
}
_ => {
ans *= f3[c];
}
}
(ans % 1000000007) as i32
}
}
题目链接
https://leetcode.cn/problems/count-number-of-texts/