golang solution, two ways to generate all the combinations.
go\nimport "sort"\n\ntype CombinationIterator struct {\n    combinations []string\n}\n\n\nfunc Constructor(characters string, combinationLength int) Combination
```go\nimport "sort"\n\ntype CombinationIterator struct {\n    combinations []string\n}\n\n\nfunc Constructor(characters string, combinationLength int) CombinationIterator {\n    return CombinationIterator{helper(characters, combinationLength)}\n}\n\n\nfunc (this *CombinationIterator) Next() string {\n    var res string\n    res, this.combinations = this.combinations[0], this.combinations[1:]\n    return res\n}\n\n\nfunc (this *CombinationIterator) HasNext() bool {\n    return len(this.combinations) > 0\n}\n\nfunc helper(s string, length int) []string {\n    var num uint32\n    for _, c := range s {\n        num |= (1 << int(c-\'a\'))\n    }\n    \n    var res []string\n    for n := num; n > 0; n = (n-1) & num {\n        if checkLength(n, length) {\n            res = append(res, transformToString(n))\n        }\n    }\n    sort.Strings(res)\n    return res\n}\n\nfunc checkLength(n uint32, length int) bool {\n    for n > 0 {\n        length -= int(n & 1)\n        n >>= 1\n    }\n    return length == 0\n}\n\nfunc transformToString(n uint32) string {\n    s := ""\n    mask := uint32(1)\n    for i := 0; i < 32; i++ {\n        if n & (mask << i) > 0 {\n            s += string(byte(i) + \'a\')\n        }\n    }\n    return s\n}\n```\n\n```go\ntype CombinationIterator struct {\n    combinations []string\n}\n\n\nfunc Constructor(characters string, combinationLength int) CombinationIterator {\n    var res []string\n    dfs([]byte(characters), &res, combinationLength, []byte{}, 0)\n    return CombinationIterator{res}\n}\n\n\nfunc (this *CombinationIterator) Next() string {\n    var res string\n    res, this.combinations = this.combinations[0], this.combinations[1:]\n    return res\n}\n\n\nfunc (this *CombinationIterator) HasNext() bool {\n    return len(this.combinations) > 0\n}\n\nfunc dfs(chars []byte, res *[]string, n int, cur []byte, pos int) {\n    if n == 0 {\n        *res = append(*res, string(cur))\n        return\n    }\n    for i := pos; i < len(chars); i++ {\n        cur = append(cur, chars[i])\n        dfs(chars, res, n-1, cur, i+1)\n        cur = cur[:len(cur)-1]\n    }\n} \n```
['Go']