如何在Swift中获取字符串的所有大小写组合?
Swift 生成字符串所有大小写组合解决方案
问题回顾
需要实现Swift方法,输入字符串后返回其所有可能的大小写组合。例如输入"abc",需返回包含8种组合的数组:["abc", "Abc", "aBc", "ABc", "abC", "AbC", "aBC", "ABC"],组合总数为2^i(i为字符串字符数)。
问题分析
你之前的实现仅能按顺序逐个将字符大写,只能生成从全小写到全大写的线性组合,无法覆盖所有独立的大小写选择情况(比如仅第二个字符大写的aBc)。正确思路是用二进制掩码表示每个字符的大小写状态:每个字符对应二进制的一位,1代表大写,0代表小写,遍历所有掩码即可生成全部组合。
实现代码
extension String { func allCaseCombinations() -> [String] { let chars = Array(self) let totalCombinations = 1 << chars.count // 等价于 2^chars.count,位运算更高效 guard totalCombinations > 0 else { return [] } var result = [String]() result.reserveCapacity(totalCombinations) // 预分配内存提升性能 for mask in 0..<totalCombinations { var currentString = "" for (index, char) in chars.enumerated() { // 检查掩码对应位是否为1,决定字符大小写 if (mask & (1 << index)) != 0 { currentString.append(char.uppercased()) } else { currentString.append(char.lowercased()) } } result.append(currentString) } return result } }
代码说明
- 字符数组转换:将字符串转为
[Character],方便通过索引直接访问每个字符。 - 组合数计算:用
1 << chars.count计算总组合数,位运算比浮点型pow(2, chars.count)更高效且避免精度问题。 - 掩码遍历:从0到
2^n -1遍历所有掩码,每个掩码的二进制位对应每个字符的大小写状态。 - 字符拼接:对每个掩码,逐个判断字符对应的二进制位,拼接出当前组合字符串并加入结果数组。
- 性能优化:提前调用
reserveCapacity预分配数组内存,避免多次扩容带来的性能损耗。
测试示例
let testString = "abc" let combinations = testString.allCaseCombinations() print(combinations) // 输出:["abc", "Abc", "aBc", "ABc", "abC", "AbC", "aBC", "ABC"]
内容的提问来源于stack exchange,提问作者user20384561
相关产品推荐
相关产品推荐

