LeetCode解说篇之2266. 统计打字方案数

打印 上一主题 下一主题

主题 894|帖子 894|积分 2682

题目形貌


题解思路

我们利用逆向思维发现如果连续按存在三个字母的按键,末了一个按键表现的字母可以是某个字母连续出现一次、两次、三次这三种环境的方案数之和
我们发现连续按存在三个字母的按键,当连续按i次时其方案数f = f[i - 1] + f[i - 2] + f[i - 3]
此中f[i - 1]表现末了一个按键表现的末了一个字母连续出现一次的方案数
f[i - 2]表现末了一个按键表现的末了一个字母连续出现l两次的方案数
f[i - 3]表现末了一个按键表现的末了一个字母连续出现三次的方案数
雷同的按存在四个字母的按键,当连续按i次时其方案数f = f[i - 1] + f[i - 2] + f[i - 3] + f[i - 4]
然后我们只需要计算全部连续的字母其出现了反复,然后将其方案数相乘就是终极的结果
题解代码

  1. func countTexts(pressedKeys string) int {
  2.     const mod = 1000000007
  3.     n := len(pressedKeys)
  4.     f3, f4 := make([]int, 0, n + 1), make([]int, 0, n + 1)
  5.     f3 = append(f3, 1, 1, 2, 4)
  6.     f4 = append(f4, 1, 1, 2, 4)
  7.     for i := 4; i <= n; i++ {
  8.         f3 = append(f3, (f3[i - 1] + f3[i - 2] + f3[i - 3]) % mod)
  9.         f4 = append(f4, (f4[i - 1] + f4[i - 2] + f4[i - 3] + f4[i - 4]) % mod)
  10.     }
  11.     ans, cnt := 1, 0
  12.     for i := 0; i < n; i++ {
  13.         cnt++
  14.         if i == n - 1 || pressedKeys[i] != pressedKeys[i + 1] {
  15.             if pressedKeys[i] == '7' || pressedKeys[i] == '9' {
  16.                 ans = ans * f4[cnt] % mod
  17.             } else {
  18.                 ans = ans * f3[cnt] % mod
  19.             }
  20.             cnt = 0
  21.         }
  22.     }
  23.     return ans
  24. }
复制代码
题目链接

https://leetcode.cn/problems/count-number-of-texts/description/

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表