我注意到这个操作对于代码来说是昂贵的(
2^set.size
)。
我正在寻找最佳实践和实现,更有可能重新工作此代码进入无限循环并冻结应用程序直到完成
func subsets(set: Set<String>) -> Set<Set<String>> {
if set.count == 1 { return [set] }
let first = set.map { item -> Set<String> in
var clone = set
clone.remove(item)
return clone
}
let second = first.map(generateSubsets)
var subSets = second.reduce(Set<Set<String>>()) { accumulator, elements in
var clone = accumulator
for element in elements {
clone.insert(element)
}
return clone
}
subSets.insert(set)
return subSets
}
用于输入
["qual1", "qual2", 'qual3"]
组合可以是:
["qual1#qual2#qual3", "qual1#qual2", "qual1#qual3", "qual2#qual3", "qual1", "qual2", "qual3"]
func subsets(set: Set<String>) -> Set<Set<String>> {
var allSubsets: Set<Set<String>> = []
let elements = Array(set)
generateSubsets(set: elements, index: 0, currentSubset: Set<String>(), allSubsets: &allSubsets)
return allSubsets
}
func generateSubsets(set: [String], index: Int, currentSubset: Set<String>, allSubsets: inout Set<Set<String>>) {
allSubsets.insert(currentSubset)
if index == set.count {
return
}
for i in index..<set.count {
var newSubset = currentSubset
newSubset.insert(set[i])
generateSubsets(set: set, index: i + 1, currentSubset: newSubset, allSubsets: &allSubsets)
}
}
像这样使用它:
let inputSet: Set<String> = ["qual1", "qual2", "qual3"]
let result = subsets(set: inputSet)