Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-列表上的简单算法任务(求职面试的标准问题)_Python_Algorithm - Fatal编程技术网

Python-列表上的简单算法任务(求职面试的标准问题)

Python-列表上的简单算法任务(求职面试的标准问题),python,algorithm,Python,Algorithm,有两个输入列表L和M,例如: L = ['a', 'ab', 'bba'] M = ['baa', 'aa', 'bb'] 如何获得2个非空输出列表U和V,以便: '.join(U)='.join(V))为真, U的每个元素都在L中,V的每个元素都在M中 例如,上述两个输入列表的一个可能解决方案是: U=['bba', 'ab', 'bba', 'a'] V=['bb', 'aa', 'bb', 'baa'] 因为 'bbaabbbaa' == 'bbaabbbaa' is

有两个输入列表L和M,例如:

L =  ['a',     'ab',  'bba']
M = ['baa', 'aa',  'bb']
如何获得2个非空输出列表U和V,以便:
'.join(U)='.join(V))为真,
U的每个元素都在L中,V的每个元素都在M中

例如,上述两个输入列表的一个可能解决方案是:

U=['bba', 'ab', 'bba', 'a']
V=['bb', 'aa', 'bb', 'baa']
因为

 'bbaabbbaa' == 'bbaabbbaa' is True
[bba'、[ab'、[bba'、[a']的每个元素都在[a'、[ab'、[bba']中。

[bb'、[aa'、[bb'、[baa']的每个元素都在['baa'、[aa'、[bb']中。

1) 创建一个至少能找到一个解决方案(U和V)的算法

2) 它能在O(n)中求解吗,其中n=len(L+M)

:wq

你在寻找什么——所有(可数无限)可能的解?“最短的”(通过某种度量)非空的解,或相等的最短解集,或

因为,如果任何解决方案都可以,那么将U和V都设置为[]符合所有规定的条件,并且是O(1)引导;-)

编辑:好吧,除了开玩笑,这里有一个非常对称的解决方案来打印可数无限非空解决方案的前十个:

import itertools as it
import collections

L = ['a', 'ab', 'bba']
M = ['baa', 'aa', 'bb']

def cmbs(L=L, M=M):
  Ucans = collections.defaultdict(list)
  Vcans = collections.defaultdict(list)
  sides = (L, Vcans, Ucans), (M, Ucans, Vcans)
  for i in it.count(1):
    for k, (G, Ocans, Tcans) in enumerate(sides):
      for u in it.product(G, repeat=i):
        j = ''.join(u)
        if j in Ocans:
          for samp in Ocans[j]:
            result = samp, u
            yield result[1-k], result[k]
        Tcans[j].append(u)

if __name__ == '__main__':
  for x, y in it.islice(cmbs(), 10):
    print x, y, ''.join(x), ''.join(y)
发出

('a', 'a') ('aa',) aa aa
('bba', 'a') ('bb', 'aa') bbaa bbaa
('a', 'a', 'a', 'a') ('aa', 'aa') aaaa aaaa
('a', 'a', 'bba', 'a') ('aa', 'bb', 'aa') aabbaa aabbaa
('a', 'ab', 'a', 'a') ('aa', 'baa') aabaa aabaa
('a', 'ab', 'bba', 'a') ('aa', 'bb', 'baa') aabbbaa aabbbaa
('bba', 'a', 'a', 'a') ('bb', 'aa', 'aa') bbaaaa bbaaaa
('bba', 'ab', 'a', 'a') ('bb', 'aa', 'baa') bbaabaa bbaabaa
('bba', 'ab', 'bba', 'a') ('bb', 'aa', 'bb', 'baa') bbaabbbaa bbaabbbaa
('bba', 'a', 'bba', 'a') ('bb', 'aa', 'bb', 'aa') bbaabbaa bbaabbaa
我不确定在一个有可数无限解的问题中,O(N)是什么意思——这里的N应该是什么?!-)


编辑2:更改为使用(默认)列表的dicts,以确保即使可以从其中一个输入集合以>1种方式生成相同的连接字符串,它也能找到所有解决方案(这种情况在样本输入中未发生,因此样本输出不受影响);例如,如果L是
['a','aa']
显然,任何带有>1
a
的连接字符串都可以以多种方式生成——当这样的连接字符串与为M生成的字符串匹配时,当前解决方案将发出所有这些多个方式,而前一个仅发出其中一个。

这是我的尝试!我认为它找到了所有的解决办法

from itertools import product 
m = 5   # top limit of elements in output lists
sumsets = lambda s1, s2: s1 | s2

for u in reduce(sumsets, [set(product(L, repeat=i)) for i in  range(1, m+1)]):
    for v in reduce(sumsets, [set(product(M, repeat=i)) for i in  range(1, m+1)]):
            if ''.join(u) == ''.join(v):
                print u, v  
输出:U,V

('a', 'a', 'a', 'a') ('aa', 'aa')
('a', 'a') ('aa',)
('a', 'a', 'bba', 'a') ('aa', 'bb', 'aa')
('bba', 'a', 'a', 'a') ('bb', 'aa', 'aa')
('bba', 'a') ('bb', 'aa')
('bba', 'ab', 'a', 'a') ('bb', 'aa', 'baa')
('a', 'ab', 'a', 'a') ('aa', 'baa')
('a', 'ab', 'bba', 'a') ('aa', 'bb', 'baa')
('bba', 'ab', 'bba', 'a') ('bb', 'aa', 'bb', 'baa')
('bba', 'a', 'bba', 'a') ('bb', 'aa', 'bb', 'aa')

这被称为the,正如其他人所说,它是不可判定的。

我想你的意思是说
U
L
的元素组成(且仅由其组成),但允许重复;同样,对于
V
M
。我说得对吗?也就是说,
U
必须包含
L
的所有元素,但不包含
M
中的元素,也不允许任意添加新元素?(我从你的例子中推断)那么V=[aa],U=[a,a]是最小解吗?不需要len(V)==len(U)?这将是L=[aa]和M=[a]情况下的解决方案;我真的希望你的面试官在你面试之前不要查看这篇文章我忘了提到U和V必须是非-empty@Alex马泰利,太好了!,只有一个小问题,这句话的意思是什么:“如果你不在Tcans:Tcans[j]=u”?我认为if语句将始终返回True,因为u是一个元组,比如('a',),j是一个字符串,比如'a'。我认为N是元素的数量L+元素的数量M。因为每个赋值只需要找到一个解决方案(不是全部),可能的解决方案的数量不必影响运行时。O(N)中的N假设为N=len(L+M)问O(N)是合适的,因为问题是要找到至少一个解如果它停止(没有特定的规定,比如我使用的
islice
),你知道它不可能找到所有(可数无限)解;-)。你的解决方案非常慢!我相信海报的目的是说明邮件通信问题,但是@psihodelia没有限制索引与LHS和RHS匹配,因此这实际上是一个不同的问题。