return value == String(value.reversed())
这就是我试过的。效果很好,但是需要更长一点的时间。有人知道更好的方法吗?
s3fp2yjn1#
标准库中没有String或其他任何东西可用,因此仅针对String的解决方案可能不是最佳选择。您不需要为基于reversed的任何东西创建一个新示例;elementsEqual完成了这项工作。
String
reversed
elementsEqual
public extension Sequence where Element: Equatable { var isSymmetric: Bool { elementsEqual(reversed()) } }
"🐈🐆🐅🐆🐈".isSymmetric // true "🐈🐆🐅".isSymmetric // false
2ul0zpep2#
你可以在c中一次测试一个字符,从开始到结束,直到你的两个索引在中间相遇,但是对于Swift,你不能保证字符在Swift String中是相同长度的,他们必须存储由unicode字符组成的字符串,这些字符串可以是100,000个字符中的一个。我认为他们目前是通过使用UTF 16存储字符串来实现这一点的。因此,您不能只使用偏移量逻辑来快速计算字符的索引,您必须枚举每个字符,检查每个字符的长度以到达下一个字符。Objective-C使这变得更加复杂,因为NSString的私有子类可能会有不同的编码方法。
cwxwcias3#
一种比反转数组更便宜的方法是同时从开头和结尾走到中间,并比较每个字符--或者符合BidirectionalCollection类型的任何Element。
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 } }
3条答案
按热度按时间s3fp2yjn1#
标准库中没有
String
或其他任何东西可用,因此仅针对String
的解决方案可能不是最佳选择。您不需要为基于
reversed
的任何东西创建一个新示例;elementsEqual
完成了这项工作。2ul0zpep2#
你可以在c中一次测试一个字符,从开始到结束,直到你的两个索引在中间相遇,但是对于Swift,你不能保证字符在Swift String中是相同长度的,他们必须存储由unicode字符组成的字符串,这些字符串可以是100,000个字符中的一个。我认为他们目前是通过使用UTF 16存储字符串来实现这一点的。因此,您不能只使用偏移量逻辑来快速计算字符的索引,您必须枚举每个字符,检查每个字符的长度以到达下一个字符。Objective-C使这变得更加复杂,因为NSString的私有子类可能会有不同的编码方法。
cwxwcias3#
一种比反转数组更便宜的方法是同时从开头和结尾走到中间,并比较每个字符--或者符合
BidirectionalCollection
类型的任何Element
。