golang 刷leetcode:统计打字方案数

alice在用手机给bob发送信息时,使用的按键和字母的对应关系如下图所示。

golang 刷leetcode:统计打字方案数

为了输入一个字母,Alice需要按对应按键的次数,等于该字母在按键上的位置。例如,要输入字母 ‘s’,Alice需要按 ‘7’ 四次;要输入字母 ‘k’,Alice需要按 ‘5’ 两次。

需要注意的是,数字 ‘0’ 和 ‘1’ 没有对应的字母,因此Alice不会使用它们。

然而,由于传输错误,Bob收到的不是Alice发送的字母信息,而是按键的字符串信息。例如,Alice发送的信息为 “bob”,Bob会收到字符串 “2266622”。

立即学习“go语言免费学习笔记(深入)”;

现在给你一个字符串 pressedKeys,表示Bob收到的字符串,请你返回Alice可能发送的总文字信息种类数。

由于答案可能非常大,需要对 10^9 + 7 取模后返回。

示例 1:

输入:pressedKeys = "22233"

输出:8

解释:

Alice可能发送的文字信息包括:

“aaadd”, “abdd”, “badd”, “cdd”, “aaae”, “abe”, “bae” 和 “ce”。

总共有8种可能的信息,因此返回8。

示例 2:

输入:pressedKeys = "222222222222222222222222222222222222"

输出:82876089

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

解释:

总共有2082876103种Alice可能发送的文字信息。

由于需要对10^9 + 7取模,返回2082876103 % (10^9 + 7) = 82876089。

提示:

1 <= pressedKeys.length <= 10^5pressedKeys 只包含数字 ‘2’ 到 ‘9’。

解题思路:

这个问题可以转化为爬楼梯问题,具体情况如下:

A. 如果连续两个字符相同,可以爬1步或2步。

B. 如果连续三个字符相同,可以爬1步、2步或3步。

C. 如果连续四个或更多字符相同,且是7或9,可以爬1步、2步、3步或4步。

D. 如果字符不相同,只能爬一步。

这是一个类似于斐波那契数列的问题。

可以通过动态规划来解决。

代码实现:

function countTexts(pressedKeys) {    const dp = new Array(pressedKeys.length + 1).fill(0);    dp[0] = 1;    for (let i = 1; i = 4 && pressedKeys[i-1] === pressedKeys[i-2] && pressedKeys[i-1] === pressedKeys[i-3] && pressedKeys[i-1] === pressedKeys[i-4] && (pressedKeys[i-1] === '7' || pressedKeys[i-1] === '9')) {            tmp = (dp[i-1] + dp[i-2] + dp[i-3] + dp[i-4]) % 1000000007;        } else if (i >= 3 && pressedKeys[i-1] === pressedKeys[i-2] && pressedKeys[i-1] === pressedKeys[i-3]) {            tmp = (dp[i-1] + dp[i-2] + dp[i-3]) % 1000000007;        } else if (i >= 2 && pressedKeys[i-1] === pressedKeys[i-2]) {            tmp = (dp[i-1] + dp[i-2]) % 1000000007;        } else {            tmp = dp[i-1];        }        dp[i] = tmp;    }    return dp[pressedKeys.length];}

目前这个实现的空间复杂度是O(n),但可以进一步优化到O(1),因为我们只需要使用到dp数组中的四个变量。因此,可以使用一个长度为4的数组来优化空间复杂度。

优化后的代码:

function countTexts(pressedKeys) {    const dp = [1, 1, 1, 1];    for (let i = 1; i = 4 && pressedKeys[i-1] === pressedKeys[i-2] && pressedKeys[i-1] === pressedKeys[i-3] && pressedKeys[i-1] === pressedKeys[i-4] && (pressedKeys[i-1] === '7' || pressedKeys[i-1] === '9')) {            tmp = (dp[3] + dp[2] + dp[1] + dp[0]) % 1000000007;        } else if (i >= 3 && pressedKeys[i-1] === pressedKeys[i-2] && pressedKeys[i-1] === pressedKeys[i-3]) {            tmp = (dp[3] + dp[2] + dp[1]) % 1000000007;        } else if (i >= 2 && pressedKeys[i-1] === pressedKeys[i-2]) {            tmp = (dp[3] + dp[2]) % 1000000007;        } else {            tmp = dp[3];        }        dp[0] = dp[1];        dp[1] = dp[2];        dp[2] = dp[3];        dp[3] = tmp;    }    return dp[3];}

以上就是golang 刷leetcode:统计打字方案数的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/460518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 03:18:04
下一篇 2025年11月8日 03:22:28

相关推荐

  • 怎样在C++中测量内存使用量?

    c++++程序的内存使用量可以通过多种方法测量:1. 使用std::malloc_usable_size进行粗略估计;2. 使用valgrind工具进行精确测量和内存泄漏检测;3. 使用智能指针(如std::unique_ptr和std::shared_ptr)管理内存,减少泄漏风险;4. 使用st…

    2025年12月18日
    000
  • 如何在 sublime text 中运行 c++ 代码

    在 #%#$#%@%@%$#%$#%#%#$%@_348c++880664f2e1458b899ced2a3518e6 text 中运行 c++ 代码需要配置构建系统。1. 安装 c++ 编译器(如 mingw、xcode 或 gcc)。2. 创建并保存 c++.sublime-build 文件,定…

    2025年12月18日
    000
  • 堆栈框架和功能调用:如何创建CPU开销

    我痴迷于计算机科学与软件工程的方方面面,尤其对底层编程情有独钟。探索软件与硬件的交互机制,分析其边界行为,着实令人着迷。即使在高级应用编程中,这些知识也能帮助调试和解决问题,例如堆栈内存的运用。理解堆栈内存的工作原理,特别是与硬件交互时,对于避免和调试问题至关重要。 本文将探讨程序中频繁的函数调用如…

    2025年12月18日
    000
  • libv是两个

    我开发了一个名为Lua-Libuv的项目,并乐于分享我的经验。项目初衷是探索如何利用Libuv(一个用C语言编写的异步I/O库)构建简单的HTTP服务器,而无需深入掌握C语言。 借助ChatGPT的辅助,我完成了HTTP.C的基础代码。在处理持久连接时,我成功实现了在适当的时机关闭连接并释放资源。起…

    好文分享 2025年12月18日
    000
  • 如何计算 CPU 百分比

    系统管理员经常面临一个棘手的问题:快速在机器上生成虚拟CPU负载。本文提供一种简单有效的解决方案,无需安装额外工具。 单核CPU负载: 最基础的方法是用C语言编写一个简单的无限循环程序。只需将以下代码保存为文件(例如,stressme.c),然后编译并运行: int main() {while (1…

    2025年12月18日
    000
  • c语言函数库在什么位置?c语言函数库怎么添加?

    C语言函数库是一个包含各种函数的工具箱,这些函数被组织在不同的库文件中。添加函数库需要通过编译器的命令行选项来指定,例如 GCC 编译器使用 -l 选项,后跟库名的缩写。如果库文件不在默认搜索路径下,则需要使用 -L 选项指定库文件路径。库有静态库和动态库之分,静态库在编译时直接链接到程序中,而动态…

    2025年12月18日
    000
  • 【Rust自学】安装Rust

    1.1.1.从官方网站安装 rust 进入rust官网,右上角可以设置语言。 点击“开始”,您将看到以下界面: 根据您的操作系统选择合适的版本:32位系统选择32位,64位系统选择64位。现在大多数计算机都是 64 位的。如果您不确定,只要您的计算机不是很旧,下载 64 位版本就应该可以正常工作。 …

    2025年12月18日 好文分享
    000
  • 5 年内最值得关注的编程语言

    这符合新兴趋势。让我们更深入地研究 2025 年的领先编程语言、它们的优势,以及为什么您应该投资掌握它们。 Python这种语言是最通用的;它在人工智能和数据科学方面表现良好,在网络开发方面也表现出色。在众多语言中,Python 除了拥有庞大的社区之外,还拥有最多的库和强大的支持。 Python 将…

    2025年12月18日
    000
  • 【Rust自学】简介

    1.0.1 前言 这个项目(包括代码和注释)是在我自学 Rust 的过程中记录的。可能有不准确或表述不清的地方,还请大家谅解。如果您从中受益,那就更好了。 1.0.2 为什么使用 Rust Rust 可靠且高效。 Rust 可以取代 C 和 C ,性能相似但安全性更高,并且不需要像 C 和 C 那样…

    2025年12月18日
    000
  • c语言入门经典教程

    C 语言是一种由丹尼斯·里奇在 1972 年开发的通用编程语言,因其效率、便携性和广泛的应用而闻名。学习 C 语言的理由包括它的基础性(许多操作系统和应用程序的基础)、对计算机系统内部工作原理的深入了解、以及其快速高效的特点(适用于实时系统和嵌入式设备编程)。 C 语言入门经典教程 什么是 C 语言…

    2025年12月18日
    000
  • C语言条件编译:新手入门到实战应用的详尽指南

    c 语言条件编译是一种根据编译时条件选择性编译代码块的机制,入门方法有:使用 #if 和 #else 指令根据条件选择代码块。常用条件表达式包括 stdc、_win32 和 linux。实战案例:根据操作系统打印不同消息。根据系统位数使用不同的数据类型。根据编译器支持不同的头文件。条件编译增强了代码…

    2025年12月18日
    000
  • C语言条件编译:庖丁解牛,彻底解决疑难问题

    C 语言条件编译:庖丁解牛,彻底解决疑难问题 概述 条件编译是 C 语言中一种强大的工具,它允许根据特定条件编译或排除代码块。它对于创建可移植、可定制和可维护的代码非常有用。 语法 立即学习“C语言免费学习笔记(深入)”; 条件编译指令有两种主要形式: 预处理器宏:由 #define 定义,并在代码…

    2025年12月18日
    000
  • C语言条件编译:从基础到高级的疑难解答全攻略

    条件编译允许开发者在编译时根据条件动态更改代码。c语言使用#指令实现条件编译,包括:宏定义 (#define)有条件编译 (#ifdef、#ifndef、#if、#elif)宏展开参数 (#、##)宏函数调用 (#(宏名)(参数列表))条件编译符号 (__line__、__file__)掌握这些技术…

    2025年12月18日
    000
  • C语言条件编译:一步到位,掌握疑难解答技巧

    条件编译疑难排查:确保已包含所需库(如 )。使用宏名称作为条件表达式,而不是常量或变量。正确使用 #endif 关闭所有条件块。确认条件表达式的评估结果与预期一致。检查 #define 指令是否正确定义宏,且不与其他宏冲突。 C 语言条件编译:疑难排查秘籍 条件编译是一种在编译过程中根据特定条件动态…

    2025年12月18日
    000
  • C语言条件编译:从零到精通,答疑解惑

    C语言条件编译:从零到精通 什么是条件编译? 条件编译允许开发者基于指定的条件在编译时选择包含或排除特定的代码。这对于在不同平台、配置或调试版本中创建定制化的代码非常有用。 条件编译指令 立即学习“C语言免费学习笔记(深入)”; C语言中的条件编译指令有: #ifdef 检查宏是否已定义#ifnde…

    2025年12月18日
    000
  • C语言条件编译:在实践场景中解决问题指南

    条件编译是 c 语言中根据特定条件编译或排除代码的功能。通过使用 #ifdef、#ifndef、#elif、#else 和 #endif 指令,可以根据宏定义的存在或不存在、嵌套条件以及其他条件满足情况来编译不同的代码块,从而解决实际问题,例如:基于宏定义启用或禁用功能。为不同平台或环境创建不同的代…

    2025年12月18日
    000
  • C语言条件编译:从案例实践到难题解答

    C 语言条件编译:从案例实践到难题解答 前言 条件编译是一种预处理技术,用于基于宏或编译器指令在编译时动态选择或排除编译单元。在 C 语言中,条件编译是通过 #if、#elif、#else 和 #endif 预处理器指令实现的。 案例实践 立即学习“C语言免费学习笔记(深入)”; 让我们从一个简单的…

    2025年12月18日
    000
  • C语言文件操作:如何处理跨平台文件操作?

    c 语言跨平台文件操作的指南:使用跨平台兼容的标准 c 库函数。定义跨平台符号表示常量,如文件分隔符和行结束符。使用 posix 函数或平台特定 api 处理文件权限和 acl。 C 语言文件操作:处理跨平台文件操作的综合指南 在 C 语言程序中处理文件时,跨平台兼容性至关重要。不同的操作系统具有不…

    2025年12月18日
    000
  • C语言条件编译:疑难解惑,实用问答集锦

    条件编译通过使用宏和预处理器命令来有条件地编译代码。具体方法包括:使用平台定义的宏进行平台特定编译。使用 debug 宏启用调试代码。使用 feature_xyz 宏有条件地包含标题文件。使用 #define 定义编译时符号。使用 #ifdef 和 #undef 有条件地编译宏。使用 #define…

    2025年12月18日
    000
  • C语言文件操作必知必会的疑难解答

    c语言文件操作疑难解答:文件打开失败:检查文件是否存在(无读权限或路径错误);eof判断错误:fseek(fp, 0, seek_set) 后再判断;写入文件失败:检查文件是否以写入模式打开(硬盘空间或权限错误);文件关闭失败:检查fp是否正确打开(刷新流);跨平台文件路径:使用 #define 定…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信