题目
字母组合迭代器:
请你设计一个迭代器类,包括以下内容:
一个构造函数,输入参数包括:一个 有序且字符唯一 的字符串 characters(该字符串只包含小写英文字母)和一个数字 combinationLength 。
函数 next() ,按 字典序 返回长度为 combinationLength 的下一个字母组合。
函数 hasNext() ,只有存在长度为 combinationLength 的下一个字母组合时,才返回 True;否则,返回 False。
示例:
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 时都存在下一个字母组合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/iterator-for-combination
著作权归领扣网络所有。
思路
主要的思想是递归,本题最重要的是如何获得按字典排序的排列组合,主要思路:
- 首先将字母按字典排序
- 每个组合的字符串的长度为 combinationLength , 如果我从原始字符串characters 选了第一个字母作为组合字符串的第一个字母,那么只能从剩下的字符串里面选择 combinationLength-1个字符串的组合, 这就是一个递归。
- 这个递归的停止条件为,当我只需要从剩下的字符串里面选一个字符(combinationLength == 1)的时候,直接返回所有可能的单个字符。
代码
class CombinationIterator(object):
def __init__(self, characters, combinationLength):
"""
:type characters: str
:type combinationLength: int
"""
# sorted the string
characters = ''.join(sorted(characters))
# combine character according to combinationlength
self.charcombine = self.combine(characters,combinationLength)
self.i = 0
def combine(self, characters, length):
if length==1:
return [k for k in characters]
res = []
for i in range(len(characters)-length+1):
strs = self.combine(characters[i+1:],length-1)
for stri in strs:
res.append(characters[i]+stri)
return res
def next(self):
"""
:rtype: str
"""
self.i += 1
return self.charcombine[self.i-1]
def hasNext(self):
"""
:rtype: bool
"""
if self.i<len(self.charcombine):
return True
else:
return False
## 复杂度分析:不太会算这道题的时间复杂度,会算的同学请留言