有一个由0和1组成的数组。 用给定的m 0和n 1来形成的最大字符串数量。每个0和1最多可以使用一次。
来源:互联网 发布:手机淘宝账户设置在哪 编辑:程序博客网 时间:2024/06/03 23:05
本题源自leetcode 474
-----------------------------------------------------------------------------------
思路:动态规划
1 遍历字符串数组的每一个字符串。统计0 和 1 的个数。然后用一个二维数组res,记录。i 个 0和 j个1能组成的最大字符串数目。
2 动态数组的更新从右下到左上。
代码:
int findMaxForm(vector<string>& strs, int m, int n) { vector<vector<int>> res(m+1,vector<int>(n+1,0)); for(string &s : strs){ int count1=0; int count2=0; for(int i=0;i<s.length();i++){ if(s[i] == '0') count1++; else count2++; } /* if((count1 <=m && count2 < n) ||(count1 < m && count2 <= n)) res++; */ for(int i=m;i >= count1;i--){ for(int j=n;j >= count2;j--){ res[i][j]=max(res[i][j],res[i-count1][j-count2]+1); } } } return res[m][n]; }
思路2:
代码:
struct comp{ bool operator()(string &s1,string& s2){ return s1.length() != s2.length() ? s1.length() < s2.length() : s1 < s2; } }; int findMaxForm(vector<string>& strs, int m, int n) { sort(strs.begin(),strs.end(),comp()); vector<int> numZeros; for(auto s : strs){ numZeros.push_back(count(s.begin(),s.end(),'0')); } int res=0; dfs(strs, numZeros, m, n, 0, 0, res); return res; } void dfs(vector<string>& strs, vector<int>& numZero, int m, int n, int start, int form, int& res) { if(res >= form + strs.size() - start) { return; } res = max(res, form); for(int i = start; i < strs.size(); i++) { if(i == start || strs[i] != strs[i-1]) { int zeros = numZero[i]; int ones = strs[i].length() - zeros; if(m - zeros >= 0 && n - ones >= 0) { dfs(strs, numZero, m - zeros, n - ones, i + 1, form + 1, res); } } } }
阅读全文
0 0
- 有一个由0和1组成的数组。 用给定的m 0和n 1来形成的最大字符串数量。每个0和1最多可以使用一次。
- 给定一个由非负整数和整数m组成的数组,可以将该数组分成m个非空的连续子数组。 写一个算法来最小化这些m个子阵列之间的最大和。
- 给定n个数,每个都可以使用无数次,用这些数的和 是否可以组成一个给定的数字
- 任意给定一个自然数N,要求M是N的倍数,且他的所有各位数字都是由0或1组成,并要求M尽可能小
- 给定正整数n和m,计算出n个元素的集合{1,2,...,n}可以划分为多少个不同的由m个元素组成的子集合
- 给定数m,求由n位数的组成m的数列(m>=n>0)
- 给定一个二进制数组,找到一个连续的0和1相等的最大子数组。
- 有一个n*n的矩阵,矩阵由 "0"和"1"组成,检测矩阵中的由"1"组成的图形是一个实心的正方形,结果为true或者false
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 输入一个数组(M,N),只可以想右边下边走,从(1,1)到(M,N)经过的最大数字和
- 长度为M的数组A,找出位置N,使得A[0]...A[N-1]和A[N]...A[M - 1]的和的乘积为最大。
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 一个只由字母数字字符和破折号组成的字符串S. 该字符串被N个破折号分成N + 1个组。 给定数字K,使得每个组包含完全K个字符,除了第一个组可能少于K
- 给定一个字符串s由大小写字母和空白字符组成,返回字符串中最后一个字的长度。 如果最后一个字不存在,则返回0。
- 字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1
- 字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1
- java__给定由大写,小写字母和空格组成的字符串,返回 最后 一个单词的长度。 如果输入中不存在单词,返回 0。
- 蓝桥杯—串逐位和(给定一个由数字组成的字符串,得到它的各个数位的和)
- SQL中的case when then else end用法
- JS的垃圾回收机制与内存管理
- Java 方法
- linux安装tomcat Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 原创 2013年07月26日
- openwrt实现挂载usb摄像头及视频保存
- 有一个由0和1组成的数组。 用给定的m 0和n 1来形成的最大字符串数量。每个0和1最多可以使用一次。
- mybatis实现原理
- mqtt
- (转)Android开发实现高德地图定位详解
- Scala-集合
- 14个JavaScript调试技巧
- HTTP协议
- 集合框架2
- C#对象数组 对应js与ts之间的转换