Swift:如何以最低复杂度实现句子中每个单词的字符反转
在Swift中高效反转句子内每个单词的字符
Hey,这个需求我之前刚好碰到过,给你一个能达到最低时间复杂度的实现方案,完全符合你的示例要求!
核心思路
要实现“单词顺序不变,每个单词内部字符反转”,最优的思路是:
- 先把原字符串拆分成独立单词(考虑到可能有多个空格/换行的情况,用系统的空白字符分割更稳妥)
- 对每个单词单独反转字符
- 最后把反转后的单词用空格拼接回去
这个思路的总时间复杂度是O(n),n是原字符串的总长度——毕竟每个字符只会被遍历一次,这已经是这个问题能做到的最优复杂度了,你总不可能不碰每个字符就完成反转对吧😉
完整代码实现(通用场景,支持多空格/换行)
let str = "Hello playground" // 处理包含多个空白字符的通用情况,过滤掉分割后产生的空字符串 let reversedWords = str.components(separatedBy: .whitespacesAndNewlines) .filter { !$0.isEmpty } .map { String($0.reversed()) } let result = reversedWords.joined(separator: " ") print(result) // 输出:olleH dnuorgyalp
简化版(仅单个空格分隔的场景)
如果你的输入字符串肯定是用单个空格分隔单词,那可以去掉过滤步骤,代码更简洁:
let str = "Hello playground" let result = str.components(separatedBy: " ") .map { String($0.reversed()) } .joined(separator: " ")
为什么这个复杂度最低?
- 分割字符串:系统的
components(separatedBy:)是线性遍历原字符串,复杂度O(n) - 反转每个单词:每个单词的
reversed()方法是O(k)(k是单词长度),所有单词的总长度就是n,所以这一步总复杂度也是O(n) - 拼接字符串:
joined(separator:)同样是线性遍历所有反转后的单词,复杂度O(n)
整体下来,所有步骤加起来的时间复杂度就是O(n),空间复杂度也是O(n)(需要存储分割后的单词和最终结果),这已经是这个问题的最优解了。
内容的提问来源于stack exchange,提问作者Saranjith
相关产品推荐
相关产品推荐

