一句话中的反向词 – 斯威夫特

如何对句子中的所有单词进行反转。

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: " ")