【LetMeFly】2266.统计打字方案数:排列组合 力扣题目链接:https://leetcode.cn/problems/count-number-of-texts/
Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。
为了 打出 一个字母,Alice 需要 按 对应字母 i
次,i
是该字母在这个按键上所处的位置。
比方说,为了按出字母 's'
,Alice 需要按 '7'
四次。类似的, Alice 需要按 '5'
两次得到字母 'k'
。
注意,数字 '0'
和 '1'
不映射到任何字母,所以 Alice 不 使用它们。
但是,由于传输的错误,Bob 没有收到 Alice 打字的字母信息,反而收到了 按键的字符串信息 。
比方说,Alice 发出的信息为 "bob"
,Bob 将收到字符串 "2266622"
。
给你一个字符串 pressedKeys
,表示 Bob 收到的字符串,请你返回 Alice 总共可能发出多少种文字信息 。
由于答案可能很大,将它对 109 + 7
取余 后返回。
示例 1:
输入: pressedKeys = "22233"
输出: 8
解释:
Alice 可能发出的文字信息包括:
"aaadd", "abdd", "badd", "cdd", "aaae", "abe", "bae" 和 "ce" 。
由于总共有 8 种可能的信息,所以我们返回 8 。
示例 2:
输入: pressedKeys = "222222222222222222222222222222222222"
输出: 82876089
解释:
总共有 2082876103 种 Alice 可能发出的文字信息。
由于我们需要将答案对 109 + 7 取余,所以我们返回 2082876103 % (109 + 7) = 82876089 。
提示:
1 <= pressedKeys.length <= 105
pressedKeys
只包含数字 '2'
到 '9'
。
解题方法:排列组合 按键2
可以按1/2/3
次,那么n
次连续的按键2
共有多少种拼写可能?
使用数组dp3
,其中dp3[n]
代表连续按2
键n
次有多少种拼写方案。我们考虑最后一个按出来的字母:
第n
次按2
可以在按了n - 1
次的基础上再按1
次(得到a
)
第n
次按2
可以在按了n - 2
次的基础上连续按2
次(得到b
)
第n
次按2
可以在按了n - 3
次的基础上连续按3
次(得到c
)
因此dp3[n] = (dp3[n - 1] + dp3[n - 2] + dp3[n - 3]) % mod
和按键2
一样,按键3/4/5/6/8
同样适用于dp3
数组;而按键7
和按键9
最多可以连按4
次,因此可以计算dp4
数组:
dp4[n] = (dp4[n - 1] + dp4[n - 2] + dp4[n - 3] + dp4[n - 4]) % mod
给你一个按键字符串如22233
,我们可以通过一次遍历很轻松地得到“连按了3
次2
,又连按了2
次3
”这一信息。
连按3
次2
可以有dp3[3]
种方案,连按2
次3
可以有dp3[2]
种方案,因此依据乘法原理,总计有dp3[3] * dp3[2]
种方案。
时间复杂度$O(len(pressedKeys))$
空间复杂度$O(len(pressedKeys))$
AC代码 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 const int mod = 1e9 + 7 ;int dp3[100001 ], dp4[100001 ];int init = []() { dp3[0 ] = dp4[0 ] = 1 ; dp3[1 ] = dp4[1 ] = 1 ; dp3[2 ] = dp4[2 ] = 2 ; dp3[3 ] = dp4[3 ] = 4 ; for (int i = 4 ; i <= 100000 ; i++) { dp3[i] = ((dp3[i- 1 ] + dp3[i - 2 ]) % mod + dp3[i - 3 ]) % mod; dp4[i] = (((dp4[i - 1 ] + dp4[i - 2 ]) % mod + dp4[i - 3 ]) % mod + dp4[i - 4 ]) % mod; } return 0 ; }();class Solution {public : int countTexts (string& pressedKeys) { long long ans = 1 ; int cnt = 0 ; for (int i = 0 ; i < pressedKeys.size (); i++) { cnt++; if (i == pressedKeys.size () - 1 || pressedKeys[i] != pressedKeys[i + 1 ]) { ans = ans * (pressedKeys[i] == '7' || pressedKeys[i] == '9' ? dp4[cnt] : dp3[cnt]) % mod; cnt = 0 ; } } return ans; } };
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ''' Author: LetMeFly Date: 2025-01-19 14:06:29 LastEditors: LetMeFly.xyz LastEditTime: 2025-01-19 14:16:32 ''' MOD = 1000000007 dp3 = [1 , 1 , 2 , 4 ] + [0 ] * 100000 dp4 = [1 , 1 , 2 , 4 ] + [0 ] * 100000 for i in range (4 , 100001 ): dp3[i] = (dp3[i - 1 ] + dp3[i - 2 ] + dp3[i - 3 ]) % MOD dp4[i] = (dp4[i - 1 ] + dp4[i - 2 ] + dp4[i - 3 ] + dp4[i - 4 ]) % MODclass Solution : def countTexts (self, pressedKeys: str ) -> int : ans = 1 cnt = 0 for i in range (len (pressedKeys)): cnt += 1 if i == len (pressedKeys) - 1 or pressedKeys[i] != pressedKeys[i + 1 ]: ans = ans * (dp4[cnt] if pressedKeys[i] == '7' or pressedKeys[i] == '9' else dp3[cnt]) % MOD cnt = 0 return ans
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 class Solution { private static final int mod = 1000000007 ; private static final int [] dp3 = new int [100001 ]; private static final int [] dp4 = new int [100001 ]; static { dp3[0 ] = dp4[0 ] = 1 ; dp3[1 ] = dp4[1 ] = 1 ; dp3[2 ] = dp4[2 ] = 2 ; dp3[3 ] = dp4[3 ] = 4 ; for (int i = 4 ; i <= 100000 ; i++) { dp3[i] = ((dp3[i- 1 ] + dp3[i - 2 ]) % mod + dp3[i - 3 ]) % mod; dp4[i] = (((dp4[i - 1 ] + dp4[i - 2 ]) % mod + dp4[i - 3 ]) % mod + dp4[i - 4 ]) % mod; } } public int countTexts (String pressedKeys) { long ans = 1 ; int cnt = 0 ; for (int i = 0 ; i < pressedKeys.length(); i++) { cnt++; if (i == pressedKeys.length() - 1 || pressedKeys.charAt(i) != pressedKeys.charAt(i + 1 )) { ans = ans * (pressedKeys.charAt(i) == '7' || pressedKeys.charAt(i) == '9' ? dp4[cnt] : dp3[cnt]) % mod; cnt = 0 ; } } return (int )ans; } }
Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 package mainconst mod int = 1000000007 var dp3 = [100001 ]int {1 , 1 , 2 , 4 }var dp4 = dp3func init () { for i := 4 ; i <= 100000 ; i++ { dp3[i] = ((dp3[i- 1 ] + dp3[i - 2 ]) % mod + dp3[i - 3 ]) % mod; dp4[i] = (((dp4[i - 1 ] + dp4[i - 2 ]) % mod + dp4[i - 3 ]) % mod + dp4[i - 4 ]) % mod; } }func countTexts (pressedKeys string ) int { ans := int64 (1 ) cnt := 0 for i, c := range pressedKeys { cnt++ if i == len (pressedKeys) - 1 || byte (c) != pressedKeys[i + 1 ] { if c == '7' || c == '9' { ans = ans * int64 (dp4[cnt]) % int64 (mod) } else { ans = ans * int64 (dp3[cnt]) % int64 (mod) } cnt = 0 } } return int (ans) }
同步发文于CSDN和我的个人博客 ,原创不易,转载经作者同意后请附上原文链接 哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/145243054