LeetCode 90子集Ⅱ91解码方法
微信搜一搜:bigsai 專注于Java、數(shù)據(jù)結(jié)構(gòu)與算法,一起進(jìn)大廠不迷路!
算法文章題解全部收錄在github倉庫bigsai-algorithm,求star!
關(guān)注回復(fù)進(jìn)群即可加入力扣打卡群,歡迎劃水。近期打卡:
LeetCode 79單詞搜索&80刪除排序數(shù)組中的重復(fù)項(xiàng)Ⅱ&81.搜索旋轉(zhuǎn)排序數(shù)組Ⅱ
LeetCode 86分割鏈表&87擾亂字符串
LeetCode 88合并兩個(gè)有序數(shù)組&89格雷編碼
子集Ⅱ
給定一個(gè)可能包含重復(fù)元素的整數(shù)數(shù)組 nums,返回該數(shù)組所有可能的子集(冪集)。
說明:解集不能包含重復(fù)的子集。
示例:
輸入: [1,2,2] 輸出: [[2],[1],[1,2,2],[2,2],[1,2],[] ]分析:
這道題和上道求子集不同的是這里面可能會(huì)出現(xiàn)重復(fù)的元素。我們需要在結(jié)果中過濾掉重復(fù)的元素。
首先,子集問題無疑是使用回溯法求得結(jié)果,首先分析如果序列沒有重復(fù)的情況,我們會(huì)借助一個(gè)boolean[]數(shù)組標(biāo)記使用過的元素和index表示當(dāng)前的下標(biāo),在進(jìn)行回溯的時(shí)候我們只向后進(jìn)行遞歸并且將枚舉到的那個(gè)元素boolean[index]置為true(回來的時(shí)候復(fù)原)。每次遞歸收集boolean[]數(shù)組中true的元素為其中一個(gè)子集。
而有重復(fù)元素的處理上,和前面全排列的處理很相似,首先進(jìn)行排序,然后在進(jìn)行遞歸處理的時(shí)候遇到相同元素只允許從第一位連續(xù)使用而不允許跳著使用,具體可以參考這張圖:
實(shí)現(xiàn)代碼為:
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 的消息通過以下方式進(jìn)行了編碼:
'A' -> 1 'B' -> 2 ... 'Z' -> 26給定一個(gè)只包含數(shù)字的非空字符串,請計(jì)算解碼方法的總數(shù)。
題目數(shù)據(jù)保證答案肯定是一個(gè) 32 位的整數(shù)。
示例 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 只包含數(shù)字,并且可能包含前導(dǎo)零。分析
本題是個(gè)動(dòng)態(tài)規(guī)劃的題,轉(zhuǎn)移方程不是很難但是需要考慮的點(diǎn)比較多。[a-z]之間的字符串。dp[]表示狀態(tài)轉(zhuǎn)移數(shù)組,有以下狀態(tài)需要考慮:
(1) xx10 xx20 結(jié)尾 只能 xx (J) 和 xx(T)這種轉(zhuǎn)換 dp[i]=dp[i-2]
(2) xx40 等數(shù)字大于20且%10==0的數(shù)字 不可能組合 返回 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等其他數(shù)字可能分解為xx(2)(5)或者xx(25)
實(shí)現(xiàn)代碼為:
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];} }原創(chuàng)不易,bigsai請你幫兩件事幫忙一下:
star支持一下, 您的肯定是我在平臺(tái)創(chuàng)作的源源動(dòng)力。
微信搜索「bigsai」,關(guān)注我的公眾號(hào),不僅免費(fèi)送你電子書,我還會(huì)第一時(shí)間在公眾號(hào)分享知識(shí)技術(shù)。加我還可拉你進(jìn)力扣打卡群一起打卡LeetCode。
記得關(guān)注、咱們下次再見!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 90子集Ⅱ91解码方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跳表(SkipList)设计与实现(ja
- 下一篇: LeetCode 92反转链表Ⅱ93复制