LeetCode 1641.统计字典序元音字符串的数目

给你一个整数 n,请返回长度为 n 、仅由元音 (a, e, i, o, u) 组成且按 字典序排列 的字符串数量。

字符串 s 按 字典序排列 需要满足:对于所有有效的 i,s[i] 在字母表中的位置总是与 s[i+1] 相同或在 s[i+1] 之前。

示例 1:

输入:n = 1
输出:5
解释:仅由元音组成的 5 个字典序字符串为 [“a”,“e”,“i”,“o”,“u”]
示例 2:

输入:n = 2
输出:15
解释:仅由元音组成的 15 个字典序字符串为
[“aa”,“ae”,“ai”,“ao”,“au”,“ee”,“ei”,“eo”,“eu”,“ii”,“io”,“iu”,“oo”,“ou”,“uu”]
注意,“ea” 不是符合题意的字符串,因为 ‘e’ 在字母表中的位置比 ‘a’ 靠后
示例 3:

输入:n = 33
输出:66045

提示:

1 <= n <= 50

法一:举例说明,当n=1时,有a、e、i、o、u 5个字符串,当n=2时,我们可以在n=1时,所有字符串的基础上做修改,具体做法是往n=1时的每个字符串前面加一个字符,a可以加到所有元音字符开头的字符串前面,e可以加到以除了a外的其他元音字符开头的字符串前面,以此类推。我们可以维护一个大小为5的数组,分别表示以a、e、i、o、u开头的字符串的数量,每次增加字符时,更新数量即可:

class Solution {
public:int countVowelStrings(int n) {// 分别表示以aeiou为开头的字符串的数量vector<int> temp = {1,1,1,1,1};for (int i = 1; i < n; ++i){// a可以放在以aeiou为开头的字符串前面,之后,以a为开头的字符串数量就是这些字符串数量之和temp[0] = temp[0] + temp[1] + temp[2] + temp[3] + temp[4];// e可以放在以eiou为开头的字符串前面,之后,以e为开头的字符串数量就是这些字符串数量之和,下同temp[1] = temp[1] + temp[2] + temp[3] + temp[4];temp[2] = temp[2] + temp[3] + temp[4];temp[3] = temp[3] + temp[4];}return accumulate(temp.begin(), temp.end(), 0);}
};

由于元音字符串的数目可以看做常量,因此此算法时间复杂度为O(n),空间复杂度为O(1)。

法二:题目等价于把n个小球放到5个盒子里,这样放到第一个盒子里的球就相当于a,第二个盒子里的球就是字符e,依此类推。问题转变为n个小球放到5个盒子里,有几种放法。这种问题的解法之一是挡板法,即把n个球直线排列形成的n-1个间隙中插挡板,有5个盒子,因此需要插4个挡板,因此放法一共有 C n − 1 4 C_{n-1}^4 Cn14种。但这个解法隐含了每个盒子里必然有一个小球,因为两间隙之间必然会有一个小球,但根据题目,盒子可以为空。我们也不能把挡板设定为可以放在n个球的两边,因为这样做只能保证两边的盒子可以为空,而中间的盒子还是至少有1个球。一个解决方案是我们可以先借5个球,一共n+5个球,这样用挡板分完5个盒子后,再每个盒子减1个球就符合题意了,这样就可以实现每个盒子里都可以为空,因此最终结果是 C n + 4 4 C_{n+4}^4 Cn+44

class Solution {
public:int countVowelStrings(int n) {return (n + 4) * (n + 3) * (n + 2) * (n + 1) / (4 * 3 * 2 * 1);}
};

由于元音字符串的数目可以看做常量,因此此算法时间复杂度为O(1),空间复杂度为O(1)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/723460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序 提交表单

微信小程序form如何提交表单 - 简书 <form bindsubmit"formSubmit">

JavaScript的for循环与双重for循环,妈妈再也不用担心我找工作了

学习路线 第一阶段&#xff1a;网页制作 HTML&#xff1a;常用标签&#xff0c;锚点&#xff0c;列表标签&#xff0c;表单标签&#xff0c;表格标签&#xff0c;标签分类&#xff0c;标签语义化&#xff0c;注释&#xff0c;字符实体 CSS&#xff1a;CSS介绍&#xff0c;全局…

解决MySQL 5.7在Redhat 9中启动报错:libncurses.so.5和libtinfo.so.5缺失问题

在使用Linux系统搭建MySQL数据库的过程中&#xff0c;我们往往会遇到各种依赖库的问题&#xff0c;尤其是在安装较旧版本的MySQL时。最近&#xff0c;在RedHat 9&#xff08;rocky linux 9&#xff09;系统上安装MySQL 5.7版本时&#xff0c;我遇到了一个典型的依赖库缺失错误&…

无法枚举容器内对象 访问被拒绝

一、什么是“无法枚举容器中的对象。访问被拒绝”错误&#xff1f; 在Windows设备当中&#xff0c;对文件或文件夹的权限进行设置可以有效地保护隐私内容。因此&#xff0c;管理员账户可以对权限进行更改&#xff0c;并且有权决定是否将内容共享给多个用户使用。但是在某些情况…

如何使用Python操作MySQL的各种功能?高级用法?

当今互联网时代&#xff0c;数据处理已经成为了一个非常重要的任务。而MySQL作为一款开源的关系型数据库&#xff0c;被广泛应用于各种场景。本篇博客将介绍如何使用Python操作MySQL的各种功能&#xff0c;以及一些高级用法。 连接MySQL 在Python中&#xff0c;我们可以使用p…

在Vue中搭建Three.js环境(超详细、保姆级),创建场景、相机、渲染器《一》

目录 Three.js简介创建vue项目引入Three.js实际操作环节文件目录创建初始化场景、相机 Three.js简介 Three.js 是一款基于 WebGL的 JavaScript 3D 库&#xff0c;它封装了 WebGL API&#xff0c;为开发者提供了简单易用的 API 来在 Web 浏览器中展示 3D 图形。Three.js 提供了…

c++设计模式总结

C设计模式是一套被广泛认可的用于解决常见对象导向设计问题的最佳实践。设计模式可以帮助开发者编写更加清晰、可维护和可扩展的代码。设计模式通常分为三大类&#xff1a;创建型、结构型和行为型。下面&#xff0c;我将分别介绍这三类设计模式的概念、应用场景和C实现示例。 …

将List转换为数组或者将数组转换为List,如果改变了原始值,转换后的数据会发生改变吗?

将List转换为数组或将数组转换为List涉及到数据结构的变化。在Java中&#xff0c;这两种转换是否会影响原始数据取决于转换的方式和使用的数据结构。下面分别解释这两种情况&#xff1a; 将List转换为数组 当你将一个List转换为数组时&#xff0c;通常通过List的toArray()方法…

CUDA学习笔记04:向量之和

参考资料 CUDA编程模型系列二(向量操作)_哔哩哔哩_bilibili &#xff08;非常好的学习资料&#xff01;&#xff09; vs2019 随意新建一个空项目&#xff0c;按照之前的环境配置配好项目依赖&#xff1a; CUDA学习笔记02&#xff1a;测试程序hello world-CSDN博客 代码结构…

JavaScript的事件初始

JavaScript 的事件初识 基本概念 html和JS做的一个约定。浏览器需要监听用户做了什么样的操作&#xff0c;并对用户的操作进行对应的反馈&#xff0c;从而形成一个动态的页面效果。 用户对于页面的一些操作(点击, 选择, 修改等) 操作都会在浏览器中产生一个个的事件。 事件的三…

《 前端挑战与未来:如何看待“前端已死”》

在技术领域&#xff0c;时常会有一些激进的言论引发热议&#xff0c;比如近年来不少人声称“前端已死”。这样的言论引发了广泛的讨论和反思。本文将从几个方向探讨这个话题&#xff1a;为什么会出现“前端已死”的言论、如何看待这种说法、前端技术的未来发展趋势以及前端人如…

MS8911S/8921S/8922M/8931S——4ns 延时、轨到轨高速比较器

产品简述 MS8911S/MS8921S/MS8922M/MS8931S 是一款具 有内部迟滞的高速比较器。其电源电压范围为 3.0V- 5.5V &#xff0c;输入和输出范围均可做到轨到轨。其输出为推 挽结构&#xff0c;兼容 CMOS/TTL 逻辑电平标准。传输延时为 4ns &#xff0c;且失调电压低。单一比…

在虚拟机vm下的Linux系统下 安装redis 超详细

打开Linux后 右键打开终端 1.输入:su root 登录root 密码是123456 2.然后输入:yum -y install gcc-c 安装gcc基础依赖包 3.yum -y install centos-release-scl 4.yum -y install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils //为了编译最新版本的Redis源码 用…

二维码门楼牌管理系统应用场景:城市规划与土地管理的新利器

文章目录 前言一、城市规划部门的新助手二、门牌数据的深度应用三、支持可持续城市发展四、与城市规划部门的联动 前言 随着科技的不断进步&#xff0c;二维码技术已经深入到我们生活的方方面面。在城市规划与土地管理领域&#xff0c;二维码门楼牌管理系统正成为一项革命性的…

在dockerfile,文件和文件夹打包到镜像中,解决文件夹文件为空的问题

一般来说直接copy就行了&#xff0c;但是不知道为什么看起来是复制过去了&#xff0c;但实际结果总为空。 最后想了一个办法&#xff0c;那就是把要复制的文件夹在外面压缩成压缩包&#xff0c;然后复制进去即可。 以复制模型缓存为例&#xff1a; FROM IMAGE&#xff1a;ve…

【Selenium】UI自动化|元素定位常见问题

1、报错NoSuchElementException——定位不到元素 分析的可能原因&#xff1a; 页面还没有加载出来&#xff0c;就对页面上的元素进行的操作 元素在iframe中&#xff0c;先要理解下frame的实质&#xff0c;frame中实际上是嵌入了另一个页面&#xff0c;而webdriver每次只能在一…

Linux中给复杂命令起别名

目录 1 前言 2 操作步骤 2.1 打开.bashrc 2.2 编辑.bashrc-添加别名 2.3 使别名生效 1 前言 在linux中有些指令会比较长&#xff0c;为了便捷的使用它们&#xff0c;我们就可以采取起别名的方式&#xff0c;具体操作如下。 2 操作步骤 2.1 打开.bashrc 输入如下指令&a…

前端WebRTC局域网1V1视频通话

基本概念 WebRTC&#xff08;Web Real-Time Communications&#xff09; 网络实时通讯&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和音频流或者其他任…

如何在2.2.1版Aduino IDE中开发ESP32

ESP32芯片集成了WIFI和蓝牙&#xff0c;而且关于生态也很不错&#xff0c;越来越多的学习者和开发者选择此类芯片&#xff0c;而不像用keil开发STM32或者51一样&#xff0c;ESP32虽然也有官方的ESP32-IDF开发软甲&#xff0c;但是经过我个人的实操体验&#xff0c;不适合小白或…

每天一个数据分析题(一百八十九)

在线性回归的高斯马尔科夫假设中&#xff0c;以下属于对残差的假设的有&#xff08;&#xff09; A. 残差序列不相关 B. 残差序列方差为1 C. 残差序列为正态分布 D. 残差序列方差相同 题目来源于CDA模拟题库 点击此处获取答案