String 确定序列是否是两个字符串重复的交错

String 确定序列是否是两个字符串重复的交错,string,algorithm,time-complexity,shuffle,interleave,String,Algorithm,Time Complexity,Shuffle,Interleave,我的任务是: 设x是有限固定字母表上的一个字符串(想想英语字母表)。鉴于 一个整数k,我们使用x^k 表示通过连接x的k个副本而获得的字符串。如果x 字符串是HELLO然后是x^3吗 这根绳子是HELLOHELLOHELLO。x的重复是正确的 x^k的前缀 对于某些整数k。因此,地狱和地狱都是地狱的重复 你好 两个字符串x和y的交错是通过对重复进行混洗而获得的任何字符串 用重复的y表示x。例如,helwolohelldwoh是 你好,世界。 描述一个以三个字符串x、y、z作为输入并决定z是否为

我的任务是:

设x是有限固定字母表上的一个字符串(想想英语字母表)。鉴于 一个整数k,我们使用x^k 表示通过连接x的k个副本而获得的字符串。如果x 字符串是HELLO然后是x^3吗 这根绳子是HELLOHELLOHELLO。x的重复是正确的 x^k的前缀 对于某些整数k。因此,地狱和地狱都是地狱的重复 你好 两个字符串x和y的交错是通过对重复进行混洗而获得的任何字符串 用重复的y表示x。例如,helwolohelldwoh是 你好,世界。 描述一个以三个字符串x、y、z作为输入并决定z是否为 x和y的交错


我只提出了一个解决方案,它具有指数复杂性(我们有指向
z
单词的指针,类似于二叉树。在每个节点中,我都有可能的单词x和y的当前状态(开始时都为空)。我正在处理z,节点有一个/两个/没有子节点,这取决于z中的下一个字符是否可以添加到x单词、y单词或没有单词。)我如何获得比指数复杂度更好的结果?

假设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
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')