| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> JAVA程序设计:不同的好子序列数目(LeetCode:1987) -> 正文阅读 |
|
[数据结构与算法]JAVA程序设计:不同的好子序列数目(LeetCode:1987) |
给你一个二进制字符串?binary?。?binary?的一个 子序列?如果是 非空?的且没有 前导?0?(除非数字是 "0"?本身),那么它就是一个 好?的子序列。 请你找到?binary?不同好子序列?的数目。 比方说,如果?binary = "001"?,那么所有 好?子序列为?["0", "0", "1"]?,所以 不同?的好子序列为?"0" 和?"1"?。 注意,子序列?"00"?,"01"?和?"001"?不是好的,因为它们有前导 0 。 一个 子序列?指的是从原数组中删除若干个(可以一个也不删除)元素后,不改变剩余元素顺序得到的序列。 示例 1: 输入:binary = "001" 输入:binary = "11" 输入:binary = "101" 提示: 1 <= binary.length <= 105 思路:参考:官方题解。考虑采用动态规划,定义dp[i][j]表示前i个字符以数字j为结尾的方案数。难点在于递推过程。考虑以下两种情况: (1)当前数为1 ? ? ? ? ?由于第i个元素不会对以0结尾的方案数产生贡献,因此f[i][0]=f[i-1][0] ? ? ? ? ?难点在于以1结尾的方案数如何变化? ? ? ? ? ?前i个字符以1结尾的方案数主要包括两个部分:前i-1个元素组成以1结尾的方案数以及必须添加第i个字符组成以1结尾的方案数。 ? ? ? ? ?前i-1个元素组成以1结尾的方案数:f[i-1][1] ? ? ? ? ?必须添加第i个字符组成以1结尾的方案数:f[i-1][0]+f[i-1][1]+1。即前i-1个字符以0结尾并且第i个字符为1;前i-1个字符已经是以1结尾了,并且使用第i个字符;只使用第i个i字符这三种情况。 ? ? ? ? ?我们需要思考这两种方案是否存在重复情况:其实可以证明,第一种方案是第二种方案的子集,详解可以参考官方题解,前边已经贴出链接。 ?(2)当前数为0 ? ? ?递推方式同理。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:32:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |