leetcode 1416. Restore The Array(恢复数组)

news2024/11/24 7:30:57

在这里插入图片描述

一台打印机没有把空格打印出来,以至于不知道打印出的 s 中到底有哪些数字。
现在知道数字的取值范围在1 ~ k, 数字开头不能是0.
返回可能的数字个数。取模109+7.

思路:

DP

假设dp[ i ]为 i ~ n位的s 所能组成的数字组合数。

从右到左遍历,说下为什么是从右到左。
因为数字要连续出现的,以“1317"为例,如果从左到右,比如现在遍历到 j = 2, 即第2个1,
而“131”这个数字中,如果取了“13”,那么和j=3的“7”组合时,就不连续了,变成了"13"和“7",这个是不好控制的。

下面以Example3的"1317"为例来说明。

初始状态,空字符串,个数为1,dp[4]=1,

i = 3, s[ i ] = “7”,7 < k, 7与空字符串组合,那么需要知道空字符串有多少种可能(dp[4] )。
这时dp[ 3 ] += dp [ 4 ].

i = 2, s[2] = “1”,1 < k,
“1”可与“7”组合成[1, 7],也可与空字符串组合成[1], 因此需要知道"7"有多少种可能( dp [ 3 ] ).
这时dp [ 2 ] += dp [ 3 ].

i = 1, s[ i ] = “3”, 3 < k, 可以选择"3"和“17”组合,那么需要知道“17”有多少种可能,
于是有[3, 17] 和 [3, 1, 7]
这时dp [ 1 ] += dp [ 2 ].

也可以选择“31“和”7“组合,31 < k, 那么需要知道"7"有多少种可能。
这时dp [ 1 ] += dp [ 3 ].

最后i = 0, s[0] = “1”, 1 < k, "1"可以和"317"组合,
dp[0] += dp[1]
13 < k , "13“和”17“组合,( [13, 17], [13, 1, 7], [13, 1] )
dp[0] += dp[2]
131 < k, "131"和“7”组合,( [131, 7] )
dp[0] += dp[3]

前提是当前数字 <= k, 如果当前数字 > k, 则进入下一个 i 的遍历。
如果当前s [ i ]为0,也进入下一遍历,因为数字不能是0开头。
最后返回dp[0], 即 0 ~ n-1的组合数。

    public int numberOfArrays(String s, int k) {
        final int MOD = (int)1e9+7;
        int n = s.length();
        int[] dp = new int[n+1]; //dp[i]:i~n的组合个数
        char[] chs = s.toCharArray();

        dp[n] = 1;
        for(int i = n-1; i >= 0; i--) {
            if(chs[i] == '0') continue; //0开头的不算
            long sum = 0, num = 0;
            for(int j = i; j < n; j++) {
                num = num*10 + (chs[j]-'0');
                if(num > k) break;
                sum += dp[j+1];
            }
            dp[i] = (int)(sum % MOD);
        }
        return dp[0];
    }

在这里插入图片描述

如果实在不好理解,可以参考下面的流程

初始状态,'': dp[4]=1
i=3,指向s[3]=7
j=3,指向s[3]=7
现在num=7
num (7) < k (2000)
[7 ~ 7] 和 [''] 组合
dp[3] += dp[4]=1
dp[3]=1

i=2,指向s[2]=1
j=2,指向s[2]=1
现在num=1
num (1) < k (2000)
[1 ~ 1] 和 [7~ 最后] 组合
dp[2] += dp[3]=1
j=3,指向s[3]=7
现在num=17
num (17) < k (2000)
[1 ~ 7] 和 [''] 组合
dp[2] += dp[4]=2
dp[2]=2

i=1,指向s[1]=3
j=1,指向s[1]=3
现在num=3
num (3) < k (2000)
[3 ~ 3] 和 [1~ 最后] 组合
dp[1] += dp[2]=2
j=2,指向s[2]=1
现在num=31
num (31) < k (2000)
[3 ~ 1] 和 [7~ 最后] 组合
dp[1] += dp[3]=3
j=3,指向s[3]=7
现在num=317
num (317) < k (2000)
[3 ~ 7] 和 [''] 组合
dp[1] += dp[4]=4
dp[1]=4

i=0,指向s[0]=1
j=0,指向s[0]=1
现在num=1
num (1) < k (2000)
[1 ~ 1] 和 [3~ 最后] 组合
dp[0] += dp[1]=4
j=1,指向s[1]=3
现在num=13
num (13) < k (2000)
[1 ~ 3] 和 [1~ 最后] 组合
dp[0] += dp[2]=6
j=2,指向s[2]=1
现在num=131
num (131) < k (2000)
[1 ~ 1] 和 [7~ 最后] 组合
dp[0] += dp[3]=7
j=3,指向s[3]=7
现在num=1317
num (1317) < k (2000)
[1 ~ 7] 和 [''] 组合
dp[0] += dp[4]=8
dp[0]=8

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

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

相关文章

【云原生进阶之容器】第六章容器网络6.7.1--阿里云Terway网络模式综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

如何在在一个账户内管理多个WhatsApp号

许多企业拥有多个WhatsApp Business账户。这可能是因为他们在多个地点都有商店&#xff0c;或者可能在全球范围内都有客户&#xff0c;并希望用当地语言迎合他们每个人。 无论出于何种原因&#xff0c;管理多个WhatsApp企业帐户既耗时又困难。但是&#xff0c;如果我们说有一种…

LoadRunner参数化最佳实践:让你的性能测试更加出色!

距离上次使用loadrunnr 已经有一年多的时间了。初做测试时在项目中用过&#xff0c;后面项目中用不到&#xff0c;自己把重点放在了工具之外的东西上&#xff0c;认为性能测试不仅仅是会用工具&#xff0c;最近又想有一把好的利器毕竟可以帮助自己更好的完成性能测试工作。这算…

【AI实战】微小目标检测模型MMDet-RFLA--训练环境从零开始搭建

【AI实战】微小目标检测模型MMDet-RFLA--训练环境搭建 RFLA介绍环境搭建安装依赖参考 RFLA介绍 官方连接 https://github.com/Chasel-Tsui/mmdet-rflaarxiv https://arxiv.org/abs/2208.08738 环境搭建 我的机器的cuda是10.2&#xff0c;根据自己的cuda版本到 https://hub.do…

python使用KDDockWidget

编译原理&#xff1a;KDDockWidget是一个C库&#xff0c;通过shiboken转成python的绑定支持。针对特殊版本&#xff0c;需要在cmake文件中增加一些变量。 注&#xff1a;本次编译&#xff0c;Qt版本统一指定为6.4.2&#xff0c;库支持Qt>5.12或6.2.0以上版本 下载仓库 Git…

解决npm安装慢卡顿reify:ajv: timing reifyNode问题、报错require() of ES Module

网上方法众多&#xff0c;但是都没有具体说明原因和具体解决办法 镜像优先推荐&#xff1a;cnpm 和 taobao 文章目录&#xff1a; 第一个错&#xff1a;Error [ERR_REQUIRE_ESM]: require() of ES Module 1.来源 2.错误显示 3.问题解决 第二个错&#xff1a; 卡顿在reify:…

(原创)Flutter基础入门:手把手教你搭建Flutter混合项目

前言 Flutter是Google开源的构建用户界面&#xff08;UI&#xff09;工具包 支持在不同平台构建一致的ui效果 但在实际业务中&#xff0c;一般不会整个APP都用纯Flutter开发 尤其一些老的项目&#xff0c;会采用接入Flutter的方式来混合开发 那么今天就主要讲一下如何搭建一个…

0424作业

实现串口收发字符/字符串 uart4.c #include "uart4.h"void hal_uart_init() {//rcc初始化//使能CPIOB组控制器RCC->MP_AHB4ENSETR | (0x1 << 1);//使能CPIOG组控制器RCC->MP_AHB4ENSETR | (0x1 << 6);//使能UART4控制器RCC->MP_APB1ENSETR | …

Linux网路服务之PXE网络批量装机和Kickstart全自动化安装

文章目录 一 、PXE网络批量装机的简介和相关知识1.1 什么是PXE1.2搭建PXE 远程安装服务器1.3 PXE装机的过程描述 二、PXE批量安装的具体操作过程2.1安装并启用 TFTP 服务2.2安装并启用 DHCP 服务2.3准备 Linux 内核、初始化镜像文件2.4准备 PXE 引导程序2.5安装FTP服务&#xf…

Android分屏流程分析

本文基于Android 11。 SystemUI模块中的Divider管理着所有关于分屏的对象&#xff1a; DividerView&#xff08;分屏分割线&#xff0c;分屏显示界面&#xff09;SplitScreenTaskOrganizer&#xff08;分屏Task组织者&#xff0c;分屏逻辑&#xff09; 这里重点关注分屏逻辑…

有道CEO周枫:当我们谈论大模型时,应该关注哪些新能力?

作者&#xff1a;周枫 基于大语言模型技术的ChatGPT推出已经有4个月了&#xff0c;更多同类产品还在快速出现。比如&#xff0c;前天谷歌更新了Bard&#xff0c;将辅助编程能力支持的语言数量扩展到20种。 然而&#xff0c;对大模型技术的重要性也出现了质疑&#xff0c;前段…

开发框架之Furion

目录 概述 框架特点 功能模块 支持平台 运行环境 数据库 应用部署 Nuget框架扩展包 Nuget框架脚手架 FurionEFCore脚手架 FurionEFCore脚手架安装命令 FurionSqlSugar脚手架 FurionSqlSugar脚手架安装命令 使用脚手架 脚手架更新 概述 Furion是一个免费开源的.Ne…

【AI帮我写代码,上班摸鱼不是梦】调教ChatGPT过程全记录,让它帮我写程序!

最近发现磁盘空间严重不足&#xff0c;都弹窗提示我了&#xff1a; 想想看到底哪个文件夹占的空间比较大&#xff0c;好做针对性的删除和清理。奈何Windows系统没有查看文件夹大小的工具&#xff0c;只能鼠标放在某个文件夹上&#xff0c;等提示&#xff1a; AI时代都来临了&am…

PCL 点云变换

文章目录 一、原理简述1、旋转矩阵2、欧氏变换二、主要函数及代码实现1、主要函数2、完整代码3、效果实现参考文献:一、原理简述 两片点云的刚体变换包含旋转和平移,变换矩阵的含义如下: 1、旋转矩阵 绕 x x

Promise异步编程

目录 一、Promise的含义 二、基本用法 三、reject的用法 四、执行顺序 五、 项目中使用promise获取后端数据 六、catch的用法 七、finally的用法 八、Promise.all() 九、Promise.all()有一个是失败 十、Promise.race()全部是成功 十一、Promise.race()有一个是失败 一、…

Java——二叉树中和为某一值的路径(二)

题目链接 牛客网在线oj题——二叉树中和为某一值的路径&#xff08;二&#xff09; 题目描述 输入一颗二叉树的根节点root和一个整数expectNumber&#xff0c;找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过…

图的相关知识总结

目录 图的概念图的存储结构邻接矩阵邻接表 图的遍历最小生成树Kruskal算法prim算法 最短路径问题单源最短路径--Dijkstra算法-单源最短路径--Bellman-Ford算法多源最短路径--Floyd-Warshall算法 图的概念 图是有顶点集合以及顶点间的关系组成的一种数据结构:G(V,E),其中顶点集…

JS-11A/224时间继电器 JOSEF约瑟 板前、板后接线

系列型号&#xff1a; JS-11A/11集成电路时间继电器&#xff1b;JS-11A/12集成电路时间继电器&#xff1b; JS-11A/13集成电路时间继电器&#xff1b;JS-11A/136集成电路时间继电器&#xff1b; JS-11A/137集成电路时间继电器&#xff1b;JS-11A/22集成电路时间继电器&#…

Java基础(十二)Java比较器

1 Java 比较器 我们知道基本数据类型的数据&#xff08;除boolean类型外&#xff09;需要比较大小的话&#xff0c;直接使用比较运算符即可&#xff0c;但是引用数据类型是不能直接使用比较运算符来比较大小的。那么&#xff0c;如何解决这个问题呢&#xff1f; 在Java中经常…

Jomalone(“独狼”)的Rootkit后门dll分析

从England.sys&#xff08;md5为B5F7DE342B1D661E57BCD14615CADEFA&#xff09;驱动文件中提取了4个dll文件&#xff0c;其中两个64位dll&#xff0c;两个32位dll&#xff0c;主要用于APC注入 样本的基本信息 文件名称: 0x3df60-0x15e00.dll 文件大小: 87.5 KB (89,600 字节) …