LeetCode 90子集Ⅱ91解码方法
微信搜一搜:
bigsai
专注于Java、数据结构与算法,一起进大厂不迷路!
算法文章题解全部收录在github仓库bigsai-algorithm,求star!
关注回复进群即可加入力扣打卡群,欢迎划水。近期打卡:
LeetCode 79单词搜索&80删除排序数组中的重复项Ⅱ&81.搜索旋转排序数组Ⅱ
LeetCode 86分割链表&87扰乱字符串
LeetCode 88合并两个有序数组&89格雷编码
子集Ⅱ
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[[2],[1],[1,2,2],[2,2],[1,2],[]
]
分析:
这道题和上道求子集不同的是这里面可能会出现重复的元素。我们需要在结果中过滤掉重复的元素。
首先,子集问题无疑是使用回溯法求得结果,首先分析如果序列没有重复的情况,我们会借助一个boolean[]数组标记使用过的元素和index表示当前的下标,在进行回溯的时候我们只向后进行递归并且将枚举到的那个元素boolean[index]置为true(回来的时候复原)。每次递归收集boolean[]数组中true的元素为其中一个子集。
而有重复元素的处理上,和前面全排列的处理很相似,首先进行排序,然后在进行递归处理的时候遇到相同元素只允许从第一位连续使用而不允许跳着使用,具体可以参考这张图:
实现代码为:
class Solution {public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);boolean jud[]=new boolean[nums.length];List<List<Integer>> valueList=new ArrayList<List<Integer>>();dfs(nums,-1,valueList,jud);return valueList;}private void dfs(int[] nums, int index, List<List<Integer>> valueList, boolean[] jud) {// TODO Auto-generated method stubList<Integer>list=new ArrayList<Integer>();for(int i=0;i<nums.length;i++){if (jud[i]) {list.add(nums[i]);}}valueList.add(list);for(int i=index+1;i<nums.length;i++){if((i==0)||(nums[i]!=nums[i-1])||(i>0&&jud[i-1]&&nums[i]==nums[i-1])){jud[i]=true;dfs(nums, i, valueList,jud);jud[i]=false;}}}
}
解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
题目数据保证答案肯定是一个 32 位的整数。
示例 1:
输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
示例 3:
输入:s = "0"
输出:0
示例 4:输入:s = "1"
输出:1
示例 5:
输入:s = "2"
输出:1
提示:
1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。
分析
本题是个动态规划的题,转移方程不是很难但是需要考虑的点比较多。[a-z]之间的字符串。dp[]表示状态转移数组,有以下状态需要考虑:
(1) xx10 xx20 结尾 只能 xx (J) 和 xx(T)这种转换 dp[i]=dp[i-2]
(2) xx40 等数字大于20且%10==0的数字 不可能组合 返回 0
(3) xx01-xx09 分解为x(x0)1-x(x0)9 dp[i]=dp[i-1]
(4) xx27 等大于26分解为xx(2)(7) 那么dp[i]=dp[i-1]
(5) xx25等其他数字可能分解为xx(2)(5)或者xx(25)
实现代码为:
class Solution {public int numDecodings(String s) {if(s.length()==0||s.charAt(0)=='0')return 0;char chS[]=s.toCharArray();int dp[]=new int[chS.length+1];dp[0]=1;dp[1]=1;for(int i=2;i<chS.length+1;i++){int value=(chS[i-2]-'0')*10+(int)(chS[i-1]-'0');if(value==10||value==20)dp[i]=dp[i-2];else if(value%10==0)return 0;else if(value>26||value<10)dp[i]=dp[i-1];elsedp[i]=dp[i-1]+dp[i-2];}return dp[chS.length];}
}
原创不易,bigsai请你帮两件事帮忙一下:
star支持一下, 您的肯定是我在平台创作的源源动力。
微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。
记得关注、咱们下次再见!
LeetCode 90子集Ⅱ91解码方法相关推荐
- LeetCode 91.解码方法
LeetCode 91.解码方法 ways: s[i] = 0 : if(s[i-1] == 1 || s[i-1] == 2) :s[i]只能和前一位绑定在一起,此时dp[i] = dp[i-2]; ...
- leetcode: 91. 解码方法
91. 解码方法 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/decode-ways/ 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : ...
- Java实现 LeetCode 91 解码方法
91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...
- 力扣--91. 解码方法
力扣–91. 解码方法 文章目录 力扣--91. 解码方法 一.题目描述 二.解题思路 三.代码 一.题目描述 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' - ...
- Leetcode-D26-动态规划(二刷)-413. 等差数列划分91. 解码方法
昨天电脑在跑东西,卡的不行,用ipad写的题,没在csdn上写 413. 等差数列划分 1.有些思路了,写下看看. class Solution:def numberOfArithmeticSlice ...
- LeetCode 91. 解码方法(动态规划)
1. 题目 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...
- 125. Leetcode 91. 解码方法 (动态规划- 字符串系列)
步骤一.确定状态: 确定dp数组及下标含义 dp[i]表示的是到i这个位置的字符串的解码方法 步骤二.推断状态方程: dp[i]的推导会取决于当前s[i]的字符情况以及前一位字符,具体如下: 如果当前 ...
- Leetcode 91. 解码方法 (每日一题 20211013)
一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映 ...
- leetcode - 91. 解码方法
一条包含字母 A-Z 的消息通过以下方式进行了编码: ′A′−>1'A' -> 1′A′−>1 ′B′−>2'B' -> 2′B′−>2 ......... ′Z′ ...
最新文章
- “懒惰”Linux 管理员的 10 个关键技巧
- 我是如何学习写一个操作系统(五):故事的高潮之进程和线程1
- python学习--windows下安装Numpy包的错误:Unable to find vcvarsall.bat
- IDEA创建第一个Spring Boot项目
- java快速排序代码6_分分钟掌握快速排序(Java / Scala 实现)
- Flex移动性能检查列表
- 2给我背书_考研村 | 在哪一瞬间,你觉得寄宿考研学校的背书教室真好?
- 在Navicat中修改表结构
- mysql实验6答案_SQL 2008课后习题答案 实验6
- Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程
- lgv30刷android10,记一次LG V30系列手机完美刷入MIUI12系统和Flyme刷机教程
- 智能网联变革下的“新赢家”:德赛西威荣登2021全球零部件供应商百强榜
- android备忘录的开发总结报告,android备忘录
- 【《Real-Time Rendering 3rd》 提炼总结】(三) 第三章 · GPU渲染管线与可编程着色器 The Graphics Processing Unit
- 攻防世界 WEB Web_python_flask_sql_injection
- 有逆时针将视频画面旋转90度的方法吗?
- css案例1——一级菜单、二级菜单、三级菜单、四级菜单
- 单臂路由器互联VLAN实验-Cisco Packet Tracer
- 2019TFE计算机科学排名,2019TFE美国会计专业研究生排名前50
- 计算机usb管理策略怎么打开,怎么打开在策略组中禁用的usb