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

goqiplq2  于 2023-01-25  发布在  Swift
关注(0)|答案(3)|浏览(122)
return value == String(value.reversed())

这就是我试过的。效果很好,但是需要更长一点的时间。有人知道更好的方法吗?

s3fp2yjn

s3fp2yjn1#

标准库中没有String或其他任何东西可用,因此仅针对String的解决方案可能不是最佳选择。
您不需要为基于reversed的任何东西创建一个新示例;elementsEqual完成了这项工作。

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

2ul0zpep2#

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

cwxwcias

cwxwcias3#

一种比反转数组更便宜的方法是同时从开头和结尾走到中间,并比较每个字符--或者符合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
  }
}

相关问题