{ "data": { "question": { "questionId": "1211", "questionFrontendId": "1286", "boundTopicId": null, "title": "Iterator for Combination", "titleSlug": "iterator-for-combination", "content": "

Design the CombinationIterator class:

\n\n\n\n

 

\n

Example 1:

\n\n
\nInput\n["CombinationIterator", "next", "hasNext", "next", "hasNext", "next", "hasNext"]\n[["abc", 2], [], [], [], [], [], []]\nOutput\n[null, "ab", true, "ac", true, "bc", false]\n\nExplanation\nCombinationIterator itr = new CombinationIterator("abc", 2);\nitr.next();    // return "ab"\nitr.hasNext(); // return True\nitr.next();    // return "ac"\nitr.hasNext(); // return True\nitr.next();    // return "bc"\nitr.hasNext(); // return False\n
\n\n

 

\n

Constraints:

\n\n\n", "translatedTitle": null, "translatedContent": null, "isPaidOnly": false, "difficulty": "Medium", "likes": 1128, "dislikes": 91, "isLiked": null, "similarQuestions": "[]", "exampleTestcases": "[\"CombinationIterator\",\"next\",\"hasNext\",\"next\",\"hasNext\",\"next\",\"hasNext\"]\n[[\"abc\",2],[],[],[],[],[],[]]", "categoryTitle": "Algorithms", "contributors": [], "topicTags": [ { "name": "String", "slug": "string", "translatedName": null, "__typename": "TopicTagNode" }, { "name": "Backtracking", "slug": "backtracking", "translatedName": null, "__typename": "TopicTagNode" }, { "name": "Design", "slug": "design", "translatedName": null, "__typename": "TopicTagNode" }, { "name": "Iterator", "slug": "iterator", "translatedName": null, "__typename": "TopicTagNode" } ], "companyTagStats": null, "codeSnippets": [ { "lang": "C++", "langSlug": "cpp", "code": "class CombinationIterator {\npublic:\n CombinationIterator(string characters, int combinationLength) {\n \n }\n \n string next() {\n \n }\n \n bool hasNext() {\n \n }\n};\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * CombinationIterator* obj = new CombinationIterator(characters, combinationLength);\n * string param_1 = obj->next();\n * bool param_2 = obj->hasNext();\n */", "__typename": "CodeSnippetNode" }, { "lang": "Java", "langSlug": "java", "code": "class CombinationIterator {\n\n public CombinationIterator(String characters, int combinationLength) {\n \n }\n \n public String next() {\n \n }\n \n public boolean hasNext() {\n \n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * CombinationIterator obj = new CombinationIterator(characters, combinationLength);\n * String param_1 = obj.next();\n * boolean param_2 = obj.hasNext();\n */", "__typename": "CodeSnippetNode" }, { "lang": "Python", "langSlug": "python", "code": "class CombinationIterator(object):\n\n def __init__(self, characters, combinationLength):\n \"\"\"\n :type characters: str\n :type combinationLength: int\n \"\"\"\n \n\n def next(self):\n \"\"\"\n :rtype: str\n \"\"\"\n \n\n def hasNext(self):\n \"\"\"\n :rtype: bool\n \"\"\"\n \n\n\n# Your CombinationIterator object will be instantiated and called as such:\n# obj = CombinationIterator(characters, combinationLength)\n# param_1 = obj.next()\n# param_2 = obj.hasNext()", "__typename": "CodeSnippetNode" }, { "lang": "Python3", "langSlug": "python3", "code": "class CombinationIterator:\n\n def __init__(self, characters: str, combinationLength: int):\n \n\n def next(self) -> str:\n \n\n def hasNext(self) -> bool:\n \n\n\n# Your CombinationIterator object will be instantiated and called as such:\n# obj = CombinationIterator(characters, combinationLength)\n# param_1 = obj.next()\n# param_2 = obj.hasNext()", "__typename": "CodeSnippetNode" }, { "lang": "C", "langSlug": "c", "code": "\n\n\ntypedef struct {\n \n} CombinationIterator;\n\n\nCombinationIterator* combinationIteratorCreate(char * characters, int combinationLength) {\n \n}\n\nchar * combinationIteratorNext(CombinationIterator* obj) {\n \n}\n\nbool combinationIteratorHasNext(CombinationIterator* obj) {\n \n}\n\nvoid combinationIteratorFree(CombinationIterator* obj) {\n \n}\n\n/**\n * Your CombinationIterator struct will be instantiated and called as such:\n * CombinationIterator* obj = combinationIteratorCreate(characters, combinationLength);\n * char * param_1 = combinationIteratorNext(obj);\n \n * bool param_2 = combinationIteratorHasNext(obj);\n \n * combinationIteratorFree(obj);\n*/", "__typename": "CodeSnippetNode" }, { "lang": "C#", "langSlug": "csharp", "code": "public class CombinationIterator {\n\n public CombinationIterator(string characters, int combinationLength) {\n \n }\n \n public string Next() {\n \n }\n \n public bool HasNext() {\n \n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * CombinationIterator obj = new CombinationIterator(characters, combinationLength);\n * string param_1 = obj.Next();\n * bool param_2 = obj.HasNext();\n */", "__typename": "CodeSnippetNode" }, { "lang": "JavaScript", "langSlug": "javascript", "code": "/**\n * @param {string} characters\n * @param {number} combinationLength\n */\nvar CombinationIterator = function(characters, combinationLength) {\n \n};\n\n/**\n * @return {string}\n */\nCombinationIterator.prototype.next = function() {\n \n};\n\n/**\n * @return {boolean}\n */\nCombinationIterator.prototype.hasNext = function() {\n \n};\n\n/** \n * Your CombinationIterator object will be instantiated and called as such:\n * var obj = new CombinationIterator(characters, combinationLength)\n * var param_1 = obj.next()\n * var param_2 = obj.hasNext()\n */", "__typename": "CodeSnippetNode" }, { "lang": "Ruby", "langSlug": "ruby", "code": "class CombinationIterator\n\n=begin\n :type characters: String\n :type combination_length: Integer\n=end\n def initialize(characters, combination_length)\n \n end\n\n\n=begin\n :rtype: String\n=end\n def next()\n \n end\n\n\n=begin\n :rtype: Boolean\n=end\n def has_next()\n \n end\n\n\nend\n\n# Your CombinationIterator object will be instantiated and called as such:\n# obj = CombinationIterator.new(characters, combination_length)\n# param_1 = obj.next()\n# param_2 = obj.has_next()", "__typename": "CodeSnippetNode" }, { "lang": "Swift", "langSlug": "swift", "code": "\nclass CombinationIterator {\n\n init(_ characters: String, _ combinationLength: Int) {\n \n }\n \n func next() -> String {\n \n }\n \n func hasNext() -> Bool {\n \n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * let obj = CombinationIterator(characters, combinationLength)\n * let ret_1: String = obj.next()\n * let ret_2: Bool = obj.hasNext()\n */", "__typename": "CodeSnippetNode" }, { "lang": "Go", "langSlug": "golang", "code": "type CombinationIterator struct {\n \n}\n\n\nfunc Constructor(characters string, combinationLength int) CombinationIterator {\n \n}\n\n\nfunc (this *CombinationIterator) Next() string {\n \n}\n\n\nfunc (this *CombinationIterator) HasNext() bool {\n \n}\n\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * obj := Constructor(characters, combinationLength);\n * param_1 := obj.Next();\n * param_2 := obj.HasNext();\n */", "__typename": "CodeSnippetNode" }, { "lang": "Scala", "langSlug": "scala", "code": "class CombinationIterator(_characters: String, _combinationLength: Int) {\n\n def next(): String = {\n \n }\n\n def hasNext(): Boolean = {\n \n }\n\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * var obj = new CombinationIterator(characters, combinationLength)\n * var param_1 = obj.next()\n * var param_2 = obj.hasNext()\n */", "__typename": "CodeSnippetNode" }, { "lang": "Kotlin", "langSlug": "kotlin", "code": "class CombinationIterator(characters: String, combinationLength: Int) {\n\n fun next(): String {\n \n }\n\n fun hasNext(): Boolean {\n \n }\n\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * var obj = CombinationIterator(characters, combinationLength)\n * var param_1 = obj.next()\n * var param_2 = obj.hasNext()\n */", "__typename": "CodeSnippetNode" }, { "lang": "Rust", "langSlug": "rust", "code": "struct CombinationIterator {\n\n}\n\n\n/** \n * `&self` means the method takes an immutable reference.\n * If you need a mutable reference, change it to `&mut self` instead.\n */\nimpl CombinationIterator {\n\n fn new(characters: String, combinationLength: i32) -> Self {\n \n }\n \n fn next(&self) -> String {\n \n }\n \n fn has_next(&self) -> bool {\n \n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * let obj = CombinationIterator::new(characters, combinationLength);\n * let ret_1: String = obj.next();\n * let ret_2: bool = obj.has_next();\n */", "__typename": "CodeSnippetNode" }, { "lang": "PHP", "langSlug": "php", "code": "class CombinationIterator {\n /**\n * @param String $characters\n * @param Integer $combinationLength\n */\n function __construct($characters, $combinationLength) {\n \n }\n \n /**\n * @return String\n */\n function next() {\n \n }\n \n /**\n * @return Boolean\n */\n function hasNext() {\n \n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * $obj = CombinationIterator($characters, $combinationLength);\n * $ret_1 = $obj->next();\n * $ret_2 = $obj->hasNext();\n */", "__typename": "CodeSnippetNode" }, { "lang": "TypeScript", "langSlug": "typescript", "code": "class CombinationIterator {\n constructor(characters: string, combinationLength: number) {\n\n }\n\n next(): string {\n\n }\n\n hasNext(): boolean {\n\n }\n}\n\n/**\n * Your CombinationIterator object will be instantiated and called as such:\n * var obj = new CombinationIterator(characters, combinationLength)\n * var param_1 = obj.next()\n * var param_2 = obj.hasNext()\n */", "__typename": "CodeSnippetNode" }, { "lang": "Racket", "langSlug": "racket", "code": "(define combination-iterator%\n (class object%\n (super-new)\n\n ; characters : string?\n\n ; combination-length : exact-integer?\n (init-field\n characters\n combination-length)\n \n ; next : -> string?\n (define/public (next)\n\n )\n ; has-next : -> boolean?\n (define/public (has-next)\n\n )))\n\n;; Your combination-iterator% object will be instantiated and called as such:\n;; (define obj (new combination-iterator% [characters characters] [combination-length combination-length]))\n;; (define param_1 (send obj next))\n;; (define param_2 (send obj has-next))", "__typename": "CodeSnippetNode" }, { "lang": "Erlang", "langSlug": "erlang", "code": "-spec combination_iterator_init_(Characters :: unicode:unicode_binary(), CombinationLength :: integer()) -> any().\ncombination_iterator_init_(Characters, CombinationLength) ->\n .\n\n-spec combination_iterator_next() -> unicode:unicode_binary().\ncombination_iterator_next() ->\n .\n\n-spec combination_iterator_has_next() -> boolean().\ncombination_iterator_has_next() ->\n .\n\n\n%% Your functions will be called as such:\n%% combination_iterator_init_(Characters, CombinationLength),\n%% Param_1 = combination_iterator_next(),\n%% Param_2 = combination_iterator_has_next(),\n\n%% combination_iterator_init_ will be called before every test case, in which you can do some necessary initializations.", "__typename": "CodeSnippetNode" }, { "lang": "Elixir", "langSlug": "elixir", "code": "defmodule CombinationIterator do\n @spec init_(characters :: String.t, combination_length :: integer) :: any\n def init_(characters, combination_length) do\n\n end\n\n @spec next() :: String.t\n def next() do\n\n end\n\n @spec has_next() :: boolean\n def has_next() do\n\n end\nend\n\n# Your functions will be called as such:\n# CombinationIterator.init_(characters, combination_length)\n# param_1 = CombinationIterator.next()\n# param_2 = CombinationIterator.has_next()\n\n# CombinationIterator.init_ will be called before every test case, in which you can do some necessary initializations.", "__typename": "CodeSnippetNode" } ], "stats": "{\"totalAccepted\": \"61.7K\", \"totalSubmission\": \"84.2K\", \"totalAcceptedRaw\": 61663, \"totalSubmissionRaw\": 84236, \"acRate\": \"73.2%\"}", "hints": [ "Generate all combinations as a preprocessing.", "Use bit masking to generate all the combinations." ], "solution": { "id": "945", "canSeeDetail": false, "paidOnly": true, "hasVideoSolution": false, "paidOnlyVideo": true, "__typename": "ArticleNode" }, "status": null, "sampleTestCase": "[\"CombinationIterator\",\"next\",\"hasNext\",\"next\",\"hasNext\",\"next\",\"hasNext\"]\n[[\"abc\",2],[],[],[],[],[],[]]", "metaData": "{\n \"classname\": \"CombinationIterator\",\n \"maxbytesperline\": 200000,\n \"constructor\": {\n \"params\": [\n {\n \"type\": \"string\",\n \"name\": \"characters\"\n },\n {\n \"type\": \"integer\",\n \"name\": \"combinationLength\"\n }\n ]\n },\n \"methods\": [\n {\n \"name\": \"next\",\n \"params\": [],\n \"return\": {\n \"type\": \"string\"\n }\n },\n {\n \"name\": \"hasNext\",\n \"params\": [],\n \"return\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"systemdesign\": true,\n \"params\": [\n {\n \"name\": \"inputs\",\n \"type\": \"integer[]\"\n },\n {\n \"name\": \"inputs\",\n \"type\": \"integer[]\"\n }\n ],\n \"return\": {\n \"type\": \"list\",\n \"dealloc\": true\n }\n}", "judgerAvailable": true, "judgeType": "large", "mysqlSchemas": [], "enableRunCode": true, "enableTestMode": false, "enableDebugger": true, "envInfo": "{\"cpp\": [\"C++\", \"

Compiled with clang 11 using the latest C++ 17 standard.

\\r\\n\\r\\n

Your code is compiled with level two optimization (-O2). AddressSanitizer is also enabled to help detect out-of-bounds and use-after-free bugs.

\\r\\n\\r\\n

Most standard library headers are already included automatically for your convenience.

\"], \"java\": [\"Java\", \"

OpenJDK 17 . Java 8 features such as lambda expressions and stream API can be used.

\\r\\n\\r\\n

Most standard library headers are already included automatically for your convenience.

\\r\\n

Includes Pair class from https://docs.oracle.com/javase/8/javafx/api/javafx/util/Pair.html.

\"], \"python\": [\"Python\", \"

Python 2.7.12.

\\r\\n\\r\\n

Most libraries are already imported automatically for your convenience, such as array, bisect, collections. If you need more libraries, you can import it yourself.

\\r\\n\\r\\n

For Map/TreeMap data structure, you may use sortedcontainers library.

\\r\\n\\r\\n

Note that Python 2.7 will not be maintained past 2020. For the latest Python, please choose Python3 instead.

\"], \"c\": [\"C\", \"

Compiled with gcc 8.2 using the gnu99 standard.

\\r\\n\\r\\n

Your code is compiled with level one optimization (-O1). AddressSanitizer is also enabled to help detect out-of-bounds and use-after-free bugs.

\\r\\n\\r\\n

Most standard library headers are already included automatically for your convenience.

\\r\\n\\r\\n

For hash table operations, you may use uthash. \\\"uthash.h\\\" is included by default. Below are some examples:

\\r\\n\\r\\n

1. Adding an item to a hash.\\r\\n

\\r\\nstruct hash_entry {\\r\\n    int id;            /* we'll use this field as the key */\\r\\n    char name[10];\\r\\n    UT_hash_handle hh; /* makes this structure hashable */\\r\\n};\\r\\n\\r\\nstruct hash_entry *users = NULL;\\r\\n\\r\\nvoid add_user(struct hash_entry *s) {\\r\\n    HASH_ADD_INT(users, id, s);\\r\\n}\\r\\n
\\r\\n

\\r\\n\\r\\n

2. Looking up an item in a hash:\\r\\n

\\r\\nstruct hash_entry *find_user(int user_id) {\\r\\n    struct hash_entry *s;\\r\\n    HASH_FIND_INT(users, &user_id, s);\\r\\n    return s;\\r\\n}\\r\\n
\\r\\n

\\r\\n\\r\\n

3. Deleting an item in a hash:\\r\\n

\\r\\nvoid delete_user(struct hash_entry *user) {\\r\\n    HASH_DEL(users, user);  \\r\\n}\\r\\n
\\r\\n

\"], \"csharp\": [\"C#\", \"

C# 10 with .NET 6 runtime

\\r\\n\\r\\n

Your code is compiled with debug flag enabled (/debug).

\"], \"javascript\": [\"JavaScript\", \"

Node.js 16.13.2.

\\r\\n\\r\\n

Your code is run with --harmony flag, enabling new ES6 features.

\\r\\n\\r\\n

lodash.js library is included by default.

\\r\\n\\r\\n

For Priority Queue / Queue data structures, you may use datastructures-js/priority-queue and datastructures-js/queue.

\"], \"ruby\": [\"Ruby\", \"

Ruby 3.1

\\r\\n\\r\\n

Some common data structure implementations are provided in the Algorithms module: https://www.rubydoc.info/github/kanwei/algorithms/Algorithms

\"], \"swift\": [\"Swift\", \"

Swift 5.5.2.

\"], \"golang\": [\"Go\", \"

Go 1.17.6.

\\r\\n\\r\\n

Support https://godoc.org/github.com/emirpasic/gods library.

\"], \"python3\": [\"Python3\", \"

Python 3.10.

\\r\\n\\r\\n

Most libraries are already imported automatically for your convenience, such as array, bisect, collections. If you need more libraries, you can import it yourself.

\\r\\n\\r\\n

For Map/TreeMap data structure, you may use sortedcontainers library.

\"], \"scala\": [\"Scala\", \"

Scala 2.13.7.

\"], \"kotlin\": [\"Kotlin\", \"

Kotlin 1.3.10.

\"], \"rust\": [\"Rust\", \"

Rust 1.58.1

\\r\\n\\r\\n

Supports rand v0.6\\u00a0from crates.io

\"], \"php\": [\"PHP\", \"

PHP 8.1.

\\r\\n

With bcmath module

\"], \"typescript\": [\"Typescript\", \"

TypeScript 4.5.4, Node.js 16.13.2.

\\r\\n\\r\\n

Your code is run with --harmony flag, enabling new ES2020 features.

\\r\\n\\r\\n

lodash.js library is included by default.

\"], \"racket\": [\"Racket\", \"

Run with Racket 8.3.

\"], \"erlang\": [\"Erlang\", \"Erlang/OTP 24.2\"], \"elixir\": [\"Elixir\", \"Elixir 1.13.0 with Erlang/OTP 24.2\"]}", "libraryUrl": null, "adminUrl": null, "challengeQuestion": null, "__typename": "QuestionNode" } } }