当前位置: 首页 > article >正文

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

文章目录

  • 题目描述
  • 题解思路
  • 题解代码
  • 题目链接

题目描述

在这里插入图片描述

题解思路

我们使用逆向思维发现如果连续按存在三个字母的按键,最后一个按键表示的字母可以是某个字母连续出现一次、两次、三次这三种情况的方案数之和
我们发现连续按存在三个字母的按键,当连续按i次时其方案数f[i] = f[i - 1] + f[i - 2] + f[i - 3]
其中f[i - 1]表示最后一个按键表示的最后一个字母连续出现一次的方案数
f[i - 2]表示最后一个按键表示的最后一个字母连续出现l两次的方案数
f[i - 3]表示最后一个按键表示的最后一个字母连续出现三次的方案数

类似的按存在四个字母的按键,当连续按i次时其方案数f[i] = f[i - 1] + f[i - 2] + f[i - 3] + f[i - 4]

然后我们只需要计算所有连续的字母其出现了几次,然后将其方案数相乘就是最终的结果

题解代码

func countTexts(pressedKeys string) int {
    const mod = 1000000007
    n := len(pressedKeys)
    f3, f4 := make([]int, 0, n + 1), make([]int, 0, n + 1)
    f3 = append(f3, 1, 1, 2, 4)
    f4 = append(f4, 1, 1, 2, 4)

    for i := 4; i <= n; i++ {
        f3 = append(f3, (f3[i - 1] + f3[i - 2] + f3[i - 3]) % mod)
        f4 = append(f4, (f4[i - 1] + f4[i - 2] + f4[i - 3] + f4[i - 4]) % mod)
    }

    ans, cnt := 1, 0
    for i := 0; i < n; i++ {
        cnt++
        if i == n - 1 || pressedKeys[i] != pressedKeys[i + 1] {
            if pressedKeys[i] == '7' || pressedKeys[i] == '9' {
                ans = ans * f4[cnt] % mod
            } else {
                ans = ans * f3[cnt] % mod
            }
            cnt = 0
        }
    }

    return ans
}

题目链接

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


http://www.kler.cn/a/349137.html

相关文章:

  • Python之openpyxl读写 Excel 文件教程
  • 面试-2024年7月16号
  • springboot根据id编辑用户账号信息
  • Zsh 安装与配置
  • 电子取证新视角:USB键盘流量提取密码方法研究与实现
  • Python脚本爬取目标网站上的所有链接
  • 低代码工单管理app评测,功能与效率解析
  • LangChain使用Prompt02
  • Matlab实现野马优化算法优化回声状态网络模型 (WHO-ESN)(附源码)
  • 算法:238.除自身以外数组的乘积
  • 浙大数据结构:11-散列3 QQ帐户的申请与登陆
  • 植物大战僵尸杂交版
  • 运行Springboot + Vue 项目
  • 回归本真 治愈心灵——汪青《在西行的路上》
  • 地平线与英伟达工具链 PTQ 工具功能参数对比与实操
  • Linux下以编译源码的方式安装Qt5与Qt6及其使用
  • AB路线——BFS+分层图
  • Git---Git打标签
  • ui入门
  • Antsword-labs靶机渗透