【问题标题】:Determine if a sequence is an interleaving of a repetition of two strings确定一个序列是否是两个字符串重复的交错
【发布时间】:2016-09-11 15:46:02
【问题描述】:

我有这个任务:

让 x 是一些有限且固定的字母表上的字符串(想想英文字母表)。给定 一个整数 k 我们使用 x^k 表示通过连接 x 的 k 个副本获得的字符串。如果 x 是字符串 HELLO 然后是 x^3 是字符串 HELLOHELLOHELLO。 x 的重复是 x^k 的前缀 对于某个整数 k。因此,HELL 和 HELLOHELL 都是 你好。 两个字符串 x 和 y 的交错是通过改组重复获得的任何字符串 x 重复 y。例如 HELwoLOHELLrldwOH 是一个交错的 你好,世界。 描述一个算法,它以三个字符串 x、y、z 作为输入并确定 z 是否为 x 和 y 的交错。

我只提出了一个具有指数复杂性的解决方案(我们有指向z 字的指针,以及一种二叉树。在每个节点中,我都有可能的字 x 和 y 的当前状态(在开头都是空白)。我正在处理 z,节点有一个/两个/没有孩子,这取决于 z 中的下一个字符是否可以添加到 x 字、y 字或没有字。)我怎么能比指数更好复杂性?

【问题讨论】:

    标签: string algorithm time-complexity shuffle interleave


    【解决方案1】:

    假设 x 和 y 这两个词的长度分别为 N1 和 N2。

    构造一个具有状态 (n1, n2) 的非确定性有限状态机,其中 0

    过渡是:

    c: (n1, n2) --> ((n1 + 1) % N1, n2) if x[n1] == c
    c: (n1, n2) --> (n1, (n1 + 1) % n2) if y[n2] == c
    

    此 NDFSM 可识别由 x 和 y 的交错重复构成的字符串。

    这里有一些实现 NDFSM 的方法:https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton#Implementation

    这是一个简单的 Python 实现。

    def is_interleaved(x, y, z):
        states = set([(0, 0)])
        for c in z:
            ns = set()
            for i1, i2 in states:
                if c == x[i1]:
                    ns.add(((i1+1)%len(x), i2))
                if c == y[i2]:
                    ns.add((i1, (i2+1)%len(y)))
            states = ns
        return bool(states)
    
    print is_interleaved('HELLO', 'world', 'HELwoLOHELLrldwOH')
    print is_interleaved('HELLO', 'world', 'HELwoLOHELLrldwOHr')
    print is_interleaved('aaab', 'aac', 'aaaabaacaab')
    

    在最坏的情况下,它将在 O(N1 * N2 * len(z)) 时间内运行并且将使用 O(N1 * N2) 空间,但在许多情况下,时间复杂度会比这更好,除非字符串 x 和 y 是重复的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2013-09-06
      • 2022-12-03
      • 2015-03-21
      • 1970-01-01
      • 2015-07-10
      • 2020-06-09
      相关资源
      最近更新 更多