You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 
问题根因

原有逻辑先按空格拆分原字符串为单词数组,仅当整个单词完全匹配忽略词列表中的项时才保留原单词不反转,没有做字符级别的忽略判断,自然无法保留指定的单个字符位置。

实现方案

调整处理逻辑,兼容整词忽略、单字符忽略两种场景,核心处理流程:

  1. 先把用户传入的待忽略内容拆分为字符集合,支持O(1)复杂度判断字符是否需要保留
  2. 沿用原有按空格拆分单词的逻辑,保证单词间空格位置完全不变,和原有行为对齐
  3. 对每个单词单独处理:
    • 提取单词中所有不需要忽略的字符,反转该字符序列
    • 遍历原单词的每个位置:如果当前字符属于待忽略字符,直接保留原字符;如果不属于,从反转后的非忽略字符序列头部取一个字符填充
  4. 把处理完的单词用空格拼接为最终结果

重写后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 20:03:21