Swift反转字符串时保留指定自定义字符不反转的方案咨询
问题说明
需求为实现字符串反转功能,反转过程中需保证用户指定的自定义字符位置、顺序不受反转影响。
现有代码仅支持按整词维度匹配待忽略内容,无法实现单个指定字符不反转的效果:
- 传入待忽略文本为整词
"FOX"时运行结果符合预期,返回"FOX si doog" - 传入待忽略字符为
"Fx"时,返回结果为"xoF si doog ",字符"F"和"x"未按预期保留位置与顺序
原有实现代码如下:
func reverseWithoutFilter(FullText:String, TextToIgnore:String) -> String { let fullTextArray = FullText.components(separatedBy: " ") let textToIgnoreArray = TextToIgnore.components(separatedBy: " ") let result = fullTextArray.map{!textToIgnoreArray.contains($0) ? String($0.reversed()) : $0} return result.joined(separator: " ") } var result = reverseWithoutFilter(FullText: "FOX is good", TextToIgnore: "FOX") // result will be "FOX si doog" var result1 = reverseWithoutFilter(FullText: "Fox is good", TextToIgnore: "Fx") // result will be "xoF si doog " characters "F" and "x" are not ignored
问题根因
原有逻辑先按空格拆分原字符串为单词数组,仅当整个单词完全匹配忽略词列表中的项时才保留原单词不反转,没有做字符级别的忽略判断,自然无法保留指定的单个字符位置。
实现方案
调整处理逻辑,兼容整词忽略、单字符忽略两种场景,核心处理流程:
- 先把用户传入的待忽略内容拆分为字符集合,支持O(1)复杂度判断字符是否需要保留
- 沿用原有按空格拆分单词的逻辑,保证单词间空格位置完全不变,和原有行为对齐
- 对每个单词单独处理:
- 提取单词中所有不需要忽略的字符,反转该字符序列
- 遍历原单词的每个位置:如果当前字符属于待忽略字符,直接保留原字符;如果不属于,从反转后的非忽略字符序列头部取一个字符填充
- 把处理完的单词用空格拼接为最终结果
重写后的代码如下:
func reverseWithoutFilter(FullText:String, TextToIgnore:String) -> String { // 生成待忽略字符集合 let ignoreChars = Set(TextToIgnore) // 按空格拆分单词逐个处理 let words = FullText.components(separatedBy: " ") let processedWords = words.map { word in // 提取当前单词中所有非忽略字符并反转 var reversedNonIgnore = Array(word.filter { !ignoreChars.contains($0) }.reversed()) var resultChars = [Character]() // 遍历原单词字符,按规则填充 for char in word { if ignoreChars.contains(char) { // 待忽略字符直接保留原位置 resultChars.append(char) } else { // 非忽略字符取反转序列的第一个字符填充 resultChars.append(reversedNonIgnore.removeFirst()) } } return String(resultChars) } return processedWords.joined(separator: " ") }
效果验证
- 测试用例1:
reverseWithoutFilter(FullText: "FOX is good", TextToIgnore: "FOX")
返回结果:"FOX si doog",和原有正确结果一致 - 测试用例2:
reverseWithoutFilter(FullText: "Fox is good", TextToIgnore: "Fx")
返回结果:"Fox si doog",字符F、x保留在原位置,其余字符正常反转,符合预期
内容的提问来源于stack exchange,提问作者heyhocombo
相关产品推荐
相关产品推荐

