【问题标题】:Find subsequence in matrix在矩阵中查找子序列
【发布时间】:2021-08-04 00:52:31
【问题描述】:

我在一个在线法官练习,我得到了这个挑战,“给定一个六字符的字符串数组(DNA字符串),如果你找到一个 4 等于连续字符的子序列,你就知道是否存在突变,你可以垂直、水平和倾斜地找到它。

所以如果我有下一个字符串数组:

dna = { "ATGCGA", "CAGTGC", "TTATGT", "AGAAGG", "CCCCTA", "TCACTG" }

它可能变成这样的矩阵:

ATGCGA
CAGTGC
TTATGT
AGAAGG
CCCCTA
TCACTG

需要注意的是,字符串的长度可能不是 6,但所有数组的长度必须相同,以形成 NxN 矩阵。

算法的输出应该是true,因为它有三个突变。

AXXXXX
XAXXXX
XXAXXX
XXXAXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX
CCCCXX
XXXXXX
XXXXGX
XXXXGX
XXXXGX
XXXXGX
XXXXXX
XXXXXX

任何这些突变都必须使算法返回它具有突变。

我尝试通过将矩阵链接成 3 个不同的字符串(即大列、大行和大对角线)来应用最长的公共子序列,但这使得算法的效率最差。

有人可以指导我吗?

【问题讨论】:

  • 你给出的例子都是连续的子序列。它们应该是连续的吗?
  • @גלעדברקן 是的,这 4 个字符在上面显示的任何形式中都必须是连续的。

标签: algorithm matrix sequence dna-sequence


【解决方案1】:

如果我们只是在寻找一个连续的相同字母序列,我们可以在 O(min(m, n)) 空间和 O(mn) 时间内解决这个问题,其中 m 是行数,n 是行数的列。从左上角逐行迭代(例如)。对于每个单元格,记录上方、左侧和西北方向的连续单元格的数量,如果该邻居具有相同的字母,则在每个方向的邻居的记录中加 1;否则,记录 1。

(如果我们正在寻找不必要的连续子序列,我们仍然可以以相同的复杂性来解决它,前提是字母表是固定的,但是我们必须为每个记录中的每个字母保留一个状态。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多