如何在Swift中检查字符串是否对称


return value == String(value.reversed())

这就是我尝试过的。它运行良好,但需要更长的时间。有人知道更好的方法吗?

标准库中没有适用于String或其他任何内容的解决方案,因此仅适用于String的解决方案可能不是最佳选择。

您不需要创建任何基于reversed的新实例;elementsEqual完成了这项工作。

public extension Sequence where Element: Equatable {
var isSymmetric: Bool { elementsEqual(reversed()) }
}
"🐈🐆🐅🐆🐈".isSymmetric // true
"🐈🐆🐅".isSymmetric // false

您可以在c中从开始到结束一次测试每个字符,直到您的两个索引在在中间相遇。但对于Swift来说,你不能保证Swift字符串中的字符长度相同,他们必须存储由unicode字符组成的字符串,这些字符目前可以有100000个字符中的一个,我认为他们目前通过使用UTF16对字符串编故事来实现这一点。因此,您不仅可以使用偏移逻辑来快速计算字符的索引,还必须枚举每个字符,检查每个字符的长度才能到达下一个字符。Objective-C使这一点变得更加复杂,因为NSString的私有子类可能具有不同的编码方法。

与反转数组相比,一种成本较低的方法是同时从开始和结束走到中间,并比较每个字符-或者符合BidirectionalCollection的类型的Element

public extension BidirectionalCollection where Element: Equatable {

var isPalindrome: Bool {
if isEmpty { return true }
var 👉 = startIndex
var 👈 = index(before: endIndex)
while 👉 < 👈 {
if self[👉] != self[👈] { return false }
formIndex(after: &👉)
formIndex(before: &👈)
}
return true
}
}

最新更新