请你设计一个迭代器类,包括以下内容: 来源:力扣(LeetCode) 32 ms 12.8 MB 20 ms 12 MB1. 题目
示例: CombinationIterator iterator = new CombinationIterator("abc", 2); // 创建迭代器 iterator iterator.next(); // 返回 "ab" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "ac" iterator.hasNext(); // 返回 true iterator.next(); // 返回 "bc" iterator.hasNext(); // 返回 false 提示: 1 <= combinationLength <= characters.length <= 15 每组测试数据最多包含 10^4 次函数调用。 题目保证每次调用函数 next 时都存在下一个字母组合。
链接:https://leetcode-cn.com/problems/iterator-for-combination
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 解题
2.1 回溯
class CombinationIterator { vector<string> ans; string path; int id = 0; public: CombinationIterator(string characters, int combinationLength){ dfs(characters, combinationLength, 0); } void dfs(string &s, int n, int idx) { if(path.size() == n) { ans.push_back(path); return; } for(int i = idx; i < s.size(); ++i) { path.push_back(s[i]); dfs(s, n, i+1);//下一个字符只能更大+1开始找 path.pop_back(); } } string next() { return ans[id++]; } bool hasNext() { return id < ans.size(); } };
2.2 位运算
class CombinationIterator { int bits; string s; int len; public: CombinationIterator(string characters, int combinationLength) { s = characters; bits = (1<<s.size())-1; len = combinationLength; } int countOne(int n) { int count = 0; while(n) { count++; n = n & (n-1); } return count; } string next() { while(bits > 0 && countOne(bits) != len) bits--; string t; for(int i = s.size()-1; i >= 0; --i) { if((bits>>i)&1) t += s[s.size()-i-1];//字符串是从左往右的,序号0开始 } bits--;//下一个数,下次搜索的起点 return t; } bool hasNext() { while(bits > 0 && countOne(bits) != len) bits--; return bits > 0; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算