Leetcode题解(28)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode题解(28)相关的知识,希望对你有一定的参考价值。
90. Subsets II
题目
分析:代码如下
1 class Solution { 2 public: 3 vector<vector<int> > subsetsWithDup(vector<int> &S) { 4 vector<vector<int> > result; 5 map<vector<int>, bool> m; 6 int size = S.size(); 7 for(int i = 0; i < pow(2.0, size); i ++) 8 { 9 int tag = i; 10 vector<int> cur; 11 for(int j = size-1; j >= 0; j --) 12 { 13 if(!tag) 14 break; 15 if(tag%2 == 1) 16 { 17 cur.push_back(S[j]); 18 } 19 tag >>= 1; 20 } 21 sort(cur.begin(), cur.end()); 22 if(m.find(cur) == m.end()) 23 { 24 m[cur] = true; 25 result.push_back(cur); 26 } 27 } 28 return result; 29 } 30 };
-----------------------------------------------------------------------------分割线--------------------------------------------------------------------
91. Decode Ways
题目
分析:这道题只需要求解码的种类数,因此一看到这道题目,就条件反射似的想到找递推公式
假设f[i]表示s[0..i]的解码数。在字符串s中,如果s[i]!=‘0‘并且s[i-1]s[i]构成的数大于等于10,小于等于26,则f[i]=f[i-1]+f[i-2]
代码如下:
1 class Solution { 2 public: 3 int numDecodings(string s) { 4 int len = s.length(); 5 6 if(len<=1) 7 { 8 if(s[0]==‘0‘) 9 return 0; 10 else 11 return len; 12 } 13 //如果第一位为0,不可能解码 14 if(s[0]==‘0‘) 15 return 0; 16 17 int first=1,second=1; 18 int temp,t; 19 20 for(int i=1;i<len;i++) 21 { 22 t=0; 23 if(s[i] != ‘0‘) 24 t +=second; 25 temp = (s[i-1]-‘0‘)*10+s[i]-‘0‘; 26 //一开始我写成temp>=1,不能通过,再仔细看题目,如果是“01”-->temp = 1这种情况是不能解码的, 27 //因此temp>=10才可以 28 if(temp>=10 &&temp <=26) 29 t +=first; 30 first = second; 31 second = t; 32 } 33 return second; 34 } 35 };
以上是关于Leetcode题解(28)的主要内容,如果未能解决你的问题,请参考以下文章