如何计算字符串二维数组的元素交集?
获取字符串二维数组的所有子数组值交集(Swift实现)
给定字符串类型的二维数组,需要找出所有子数组中共同存在的元素(值层面的交集)。以下是示例场景:
示例输入
let arrayOfArrayOfStrings = [ ["J", "C", "A", "E"], ["A", "C", "J", "E"], ["R", "J", "A", "E"] ]
预期输出
["A", "E", "J"](顺序可按需调整)
解决方案一:利用Set的交集特性
Swift的Set原生支持交集运算,是处理这类问题最简洁的方式。通过逐步求交集的方式,可快速得到所有子数组的共同元素。
let arrayOfArrayOfStrings = [ ["J", "C", "A", "E"], ["A", "C", "J", "E"], ["R", "J", "A", "E"] ] // 处理二维数组为空的边界情况 guard let firstSubarray = arrayOfArrayOfStrings.first else { print("二维数组为空,无交集元素") return } // 初始交集集合为第一个子数组的元素集合 var commonSet = Set(firstSubarray) // 遍历剩余子数组,逐步求交集 for subarray in arrayOfArrayOfStrings.dropFirst() { commonSet = commonSet.intersection(subarray) // 提前终止:如果交集为空,无需继续遍历 if commonSet.isEmpty { break } } // 转成有序数组(匹配预期输出顺序) let result = commonSet.sorted() print(result) // 输出 ["A", "E", "J"]
说明
- 先处理边界情况:如果二维数组为空,直接返回提示。
- 以第一个子数组的元素集合作为初始交集,依次和后续子数组的元素求交集。
- 可提前终止遍历:若中途交集变为空,后续子数组不会改变结果,直接跳出循环提升效率。
- 通过
sorted()将无序的Set转为有序数组,匹配预期输出的顺序。
解决方案二:统计元素出现的子数组次数
如果不想依赖Set,也可以通过统计元素在子数组中的出现次数筛选交集元素——只有在所有子数组中都出现的元素,其出现次数才等于子数组的总数。
let arrayOfArrayOfStrings = [ ["J", "C", "A", "E"], ["A", "C", "J", "E"], ["R", "J", "A", "E"] ] let totalSubarrays = arrayOfArrayOfStrings.count var elementOccurrence = [String: Int]() // 统计每个元素在多少个不同的子数组中出现 for subarray in arrayOfArrayOfStrings { // 子数组去重,避免同一子数组内重复元素重复计数 let uniqueElements = Set(subarray) for element in uniqueElements { elementOccurrence[element, default: 0] += 1 } } // 筛选出在所有子数组中都出现的元素 let commonElements = elementOccurrence.filter { $0.value == totalSubarrays }.keys // 转成有序数组 let result = commonElements.sorted() print(result) // 输出 ["A", "E", "J"]
说明
- 遍历每个子数组时先转成Set去重,确保每个子数组对元素的计数只算一次。
- 最后筛选出计数等于子数组总数的元素,这些就是所有子数组的共同元素。
内容的提问来源于stack exchange,提问作者Radioactive
相关产品推荐
相关产品推荐

