Swift:对数组中字符串按字符排序并过滤重复字符组合
解决Swift中过滤字符组成相同的重复字符串问题
嗨,这个需求我完全get到了!你之前要生成字符串的全排列,现在要剔除那些字符组成完全一致只是顺序不同的重复项,你的思路——给每个字符串按字母排序生成特征键——真的很精准,这就是最直接高效的解决方案。
核心思路
给每个字符串生成一个「唯一特征键」:把字符串的字符按字母顺序排序后组成新字符串。比如"CA"排序后得到"AC",这样所有字符组成相同的字符串都会拥有同一个特征键。我们只需要保留每个特征键对应的第一个出现的字符串即可。
具体实现代码
首先写一个生成特征键的辅助函数,然后遍历原数组,用集合跟踪已经见过的特征键,同时收集结果:
// 生成排序后的特征键,可选支持大小写不敏感 func sortedCharacterKey(for str: String, caseInsensitive: Bool = false) -> String { let processedString = caseInsensitive ? str.lowercased() : str return String(processedString.sorted()) } // 示例输入 let input = ["AB", "AC", "CA", "CB"] var seenKeys = Set<String>() var filteredResult = [String]() for string in input { let key = sortedCharacterKey(for: string) // 如果这个特征键没出现过,就保留当前字符串并记录键 if !seenKeys.contains(key) { seenKeys.insert(key) filteredResult.append(string) } } print(filteredResult) // 输出: ["AB", "AC", "CB"]
额外说明
- 这个方法适用于任意长度的字符串,比如"ABC"和"CBA"也会被正确识别为重复项;
- 如果需要忽略大小写(比如"aC"和"Ac"视为重复),只需要调用函数时传
caseInsensitive: true即可; - 结果数组的顺序和原数组中首次出现该特征键的字符串顺序一致,完全符合你的示例预期。
内容的提问来源于stack exchange,提问作者koen
相关产品推荐
相关产品推荐

