【问题标题】:Search Array for Longest String that is a Prefix of Search String搜索作为搜索字符串前缀的最长字符串的数组
【发布时间】:2019-06-18 19:10:53
【问题描述】:

我是一名新的 Swift 开发人员。我正在使用 Swift 4.2 和 Xcode 10.2。

我想在一个数组中搜索与我的搜索字符串相比具有最多字符的单个结果。更具体地说,我需要数组中最长的字符串,它是搜索字符串的前缀。

例如,如果我的数组是:

let array = ["1", "13", "1410", "1649", "1670"]

我的搜索字符串是:

let searchString = "16493884777"

我希望结果是"1649"

我找不到另一个有快速解决方案的 SO 问题。

【问题讨论】:

  • 您是在寻找与搜索字符串有最多共同字符的条目,还是寻找具有最长公共前缀的条目?换句话说:xxx16493884777 是否符合最佳结果?
  • 对不起,不够清晰。最长的公共前缀是我需要的。该数组将包含唯一的字符串。 xxx16493884777 不符合最佳结果。

标签: swift string search startswith


【解决方案1】:

您可以从末尾迭代前缀数组(假设前缀数组已排序)并在遇到匹配时立即返回,因为该前缀将保证是最长的,因为不能存在另一个相同长度的匹配前缀:

import Foundation

func longestMatchingPrefix(_ prefixArray: [String], _ searchString: String) -> String {
    for p in prefixArray.reversed() {
        if searchString.hasPrefix(p) {
           return p
        }
    }
    return "No matching prefix found"
}

print(longestMatchingPrefix(["1", "13", "1410", "1649", "1670"], "16493884777"))

输出:

1649

【讨论】:

  • 谢谢。这是一个优雅的解决方案。正在使用我的更大阵列进行测试,但它在操场上运行良好。
  • longestMatchingPrefix(["1", "13", "1410", "1649", "1670"], "164") 返回“1”而不是“1649”——这是预期的结果吗?
  • 是的。那是正确的。因为 searchString 164 没有 9,所以我不想使用那个结果。同样,如果我搜索“1200”,我希望得到“1”。
  • @TMLynch:所以您不是在寻找具有最长公共前缀的字符串,而是寻找作为搜索字符串前缀的最长字符串?也许您应该澄清您的问题(为了本问答的未来读者)。
  • 注意这个方案可以简化为prefixArray.reversed().first(where: searchString.hasPrefix)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2014-10-06
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多