我有一个算法,我无法挤出任何与答案近似的东西,所以这只是一个任务。
给定一个字符串数组S。N每条线的长度相同M。任务是在数组中找到一对字符串,S其中两个字符串在同一位置具有相同的字母。
例如:
S = ["abc", "bea", "dbe'],第 0 行"abc"和第 2 行在位置 1"dbe"具有相同的字母"b"。另一方面,对于字符串“abc”和“bea”,它们没有相同字母的位置。如果没有这样的对,该函数应该返回一个空数组。如果有多个正确答案,该函数可能会返回其中任何一个。
结果是一个由三个整数组成的数组。前两个整数是S
属于该对的字符串的索引。第三个整数是普通字母的位置。
更多示例:
S = ["abc", "bea", "dbe"]结果:[0, 2, 1]。另一个正确答案是[2, 0, 1],因为行索引的顺序无关紧要。
S = ["abc", "bca", "dbe"]->[0, 2, 1]
S = ["zzzz", "ferz", "zdsr", "fgtd']可以返回[0, 1, 3]since "zzzz",并且"ferz"在"z"位置 3。该函数还可以返回将按字母[1, 3, 0]匹配字符串。"ferz", "fgtd""f"
S = ["gr", "sd", "rg"]必须返回[],因为没有符合条件的行对
S = ["bdafg", 'ceagi']该函数应该返回[0, 1, 2]
为以下假设编写一个有效的算法:
N它int在 [1..30000] 范围内;M它int在 [1..2000] 范围内;- 每个元素
S仅由小写拉丁字母 (az) 组成; - N * M < 30,000。
我是这样决定的:(结果相当“笨拙地 - 休息”,但您问题中的所有示例都正确通过)。我在代码中添加了注释,但如果有些地方不清楚,请询问。实际上,我将任务分为 3 个任务:每个任务都是计算输出数组元素之一。从最后一个元素开始,以零结束。
1)搜索重复的索引。考虑到问题条件下数组中的所有字符串都具有相同的长度,我将每个 0 字符添加到 LIST(检查工作表中是否有相同的字符)。如果每个人都已添加,我会转到下一个字符并从所有字符串中添加 1 个字符。依此类推,直到我在字符串中找到重复字符的位置。我把它写到结果[2]。现在我们知道在哪里寻找重复。
3) 最简单的是第二行,它与在点 0 中找到的位置的第二个点中找到的字符串具有相同的索引。我们把它写在结果[0]中。返回结果
结论:
时间线性
(正如 Stanislav Volodarskiy 建议的,一般来说,
O(min(алфавит, N) * M))一个变体:创建一个包含 26 个哈希图的数组(使用 索引
символ-"a",例如,对于字符“z”索引 25)(позиция:номер строки)我们遍历字符串,如果还没有键,则为每个字符添加一对到相应的字典中。如果这样的密钥已经存在,那么已经找到了解决方案。在 Python 中: