一句话中的反向词 – 斯威夫特
如何对句子中的所有单词进行反转。
例
let str = "Hello playground"
结果应该像"olleH dnuorgyalp"
最小的复杂性。
您可以使用.byWords
选项使用String
方法enumerateSubstrings
使用反转的子字符串替换每个单词的子范围。 请注意,这样标点符号将保持不变:
var str = "Hello, playground!!!" str.enumerateSubstrings(in: str.startIndex..
这是典型的函数式编程方法(也由@Saranjith发布)
let result = str .components(separatedBy: " ") .map { $0.reversed() } .joined()
复杂
首先让我们来定义
-
n
:输入字符串中的字符数 -
k
:输入字符串中的单词数(当然k <= n)
⏳时间复杂度
现在让我们看看每段代码的时间复杂度
.components(separatedBy:“”)
这条指令需要遍历整个字符串,所以O(n)
.map {$ 0.reversed()}
这里每个单词都是相反的。 所以,如果我们有k
单词,我们就有时间复杂度
O(m0) + O(m1) + ... + O(mk-1)
其中mi
是第i-th
单词的长度。 然而,所有单词的长度总和<= n,所以我们可以这么说
O(m0) + O(m1) + ... + O(mk-1) <= O(n)
.joined()
最后,我们有k
词需要加入到gheter中。 这可以在O(k)
中完成,再次, <= O(n)
。
包起来
let result = str .components(separatedBy: " ") // O(n) .map { $0.reversed() } // O(m0) + O(m1) + ... + O(mk-1) <= O(n) .joined() // O(k) <= O(n)
时间复杂度= O(n)+ O(n)+ O(n)= O(n)
🚀空间复杂性
.components(separatedBy:“”)
这里我们构建k Strings (m0, m1, ..., mk-1)
。 这些k-1
字的长度之和将是<= n
所以这里的空间复杂度是O(n)
。
.map {$ 0.reversed()}
对于每个(m0,m1,...,mk-1),我们正在构建一个副本。 所以,再次, O(n)
。
.joined()
这里我们构建的结果是一个包含n个字符的字符串。 因此空间复杂度为O(n)。
空间复杂度:O(n)+ O(n)+ O(n)= O(n)。
工作代码!
import UIKit var str = "Hello playground" let result = str.split(separator: " ").map { String($0.reversed())}.joined(separator: " ") print(result) // olleH dnuorgyalp
在OPs答案的基础上,如果你想在输出上遵循英语大小写规则:
var str = "Hello playground" let result = str.split(separator: " ").enumerated().map { let reversed = String($0.1.reversed()) return $0.0 == 0 ? reversed.capitalized : reversed.lowercased() } .joined(separator: " ") print("Rerversing letters in each word = \"" + result + "\"") // Olleh dnuorgyalp
还要注意多个空格会搞乱这一点,就像逗号,句号和其他单词/句子分隔符一样。
let result = String(str.reversed()) .components(separatedBy: .whitespaces) .reversed() .joined(separator: " ")