Ios 从字符串数组中查找最常见的子字符串

Ios 从字符串数组中查找最常见的子字符串,ios,arrays,swift,search,longest-substring,Ios,Arrays,Swift,Search,Longest Substring,我想从字符串数组中搜索一个单词 array = ["ram","gopal","varma","govind","ravan","alan"] 如果我的搜索文本是goal,我想列出如下内容: result = ["gopal","govind","alan"] 在gopal和goal中,ie只缺少p,因此它应该在具有更高优先级的搜索列表中 有什么方法可以进行这种过滤吗?您想找到最长的公共子序列。我建议您阅读Ray Wenderlich的Swift算法俱乐部的优秀文章,在那里您可以通过示例找到

我想从字符串数组中搜索一个单词

array = ["ram","gopal","varma","govind","ravan","alan"]
如果我的搜索文本是
goal
,我想列出如下内容:

result = ["gopal","govind","alan"]
gopal
goal
中,ie只缺少
p
,因此它应该在具有更高优先级的搜索列表中


有什么方法可以进行这种过滤吗?

您想找到最长的公共子序列。我建议您阅读Ray Wenderlich的Swift算法俱乐部的优秀文章,在那里您可以通过示例找到您的解决方案

编辑:

然后,您必须迭代数组并跟踪每个世界的子序列的长度(例如在字典中)。然后,您必须按子序列长度对数组进行排序

例如:

let array = ["ram", "gopal", "varma", "govind", "ravan", "alan"]
let searchTerm = "goal"

var dictionary: [String: Int] = [:]
for element in array {
    dictionary[element] = searchTerm.longestCommonSubsequence(element).count
}

let result = dictionary.sorted(by: { $0.1 > $1.1 }).map { $0.key }

两个字符串之间最长的公共子序列可以递归定义如下:

func lcs(_ str1: String, _ str2: String, _ i: String.Index, _ j: String.Index) -> Int 
{
    if (i == str1.startIndex || j == str2.startIndex) {
        return 0
    }

    let beforeI = str1.index(before: i)
    let beforeJ = str2.index(before: j)

    if str1[beforeI] == str2[beforeJ] {
        return 1 + lcs(str1, str2, beforeI, beforeJ)
    } else {
        return max(lcs(str1, str2, i, beforeJ), lcs(str1, str2, beforeI, j))
    }
}
您可以找到此动态规划算法工作原理的完整解释

因此,给定字符串数组和搜索文本:

let array = ["ram", "gopal", "varma", "govind", "ravan", "alan", "logan"]
let searchText = "goal"
我们可以将分数与数组的每个元素相关联,只过滤分数不为零的元素,按分数排序,然后只键入元组中的单词:

let result = array
    .map { ($0, lcs(searchText,
                    $0,
                    searchText.endIndex,
                    $0.endIndex)) }
    .filter { $0.1 > 0 }
    .sorted { $0.1 > $1.1 }
    .map { $0.0 }

print(result)
这将产生:

[“gopal”、“govind”、“alan”、“logan”、“ram”、“varma”、“ravan”]


您需要单个对象还是多个对象?实际上,我需要一个项目数组,如问题中所示。ie包含搜索文本子序列的所有项目。但最相似的单词应该显示为列表中的第一个。在
“ram”
和其他单词中有一个
a
。公共子序列应该至少有2个字符吗?数组=[“ram”、“gopal”、“varma”、“govind”、“varma”、“ravan”、“gopal”、“ravan”、“alan”]输出是什么?请共享此数组的个数。@Carpsen90是的,这是真的。我使用上面的结果只是为了显示我的优先级。瓦玛,拉姆,拉万也应该在名单上,因为一个共同点。结果=[“gopal”、“govind”、“alan”、“varma”、“ravan”、“ram”]是。我可以找到最长的常用子序列算法。但这是用来比较两个字符串的,对吗?我有一个包含1000个项目的数组,因为这很难做到。你必须迭代数组,并跟踪每个世界的子序列的长度(例如在字典中)。然后,您必须按子序列长度对数组进行排序。