【问题标题】:Check if a String can be created by linking elements in a list检查是否可以通过链接列表中的元素来创建字符串
【发布时间】:2017-09-17 14:32:46
【问题描述】:

我想检查是否可以通过链接给定列表中的元素来创建字符串,以及该串联是什么。 例如:

String = 'BIBER'
List = ['BI', 'BIB', 'BIBE', 'BE', 'BER', 'ER']

“BIBER”可以由“BI”和“BER”构建,

所以程序应该返回 TRUE 和一个包含组件的列表:

components = ['BI','BER']

我已经试过了,但我无法检查组件是什么:

r = re.compile("(?:" + "|".join(List) + ")*$")
    if r.match(Word) != None:
        print('TRUE')

【问题讨论】:

  • 大概还有BIBER
  • 一个连接就足够了
  • 如果List 中只有一个元素(可能是BI) - 是否希望它可以匹配 BIBI/BIBIBI 等...?
  • 是的,列表中的元素可以多次使用
  • List 是否可以包含一个字符作为项目,例如 ['E', 'B', ...]

标签: python regex string list concatenation


【解决方案1】:

使用itertools.combinations...

这个函数应该可以完成这项工作:

def check(String, List):
    return String in [a+b for a,b in itertools.combinations(List, 2)]

返回 True 以供您输入:

check('BIBER', ['BI', 'BIB', 'BIBE', 'BE', 'BER', 'ER'])

【讨论】:

    【解决方案2】:

    你可以使用蛮力:

    s = 'BIBER'
    li = ['BI', 'BIB', 'BIBE', 'BE', 'BER', 'ER']
    
    import itertools as it
    
    for i in range(2,len(li)+1):
        for t in it.permutations(li, i):
            if ''.join(t)==s:
                print t
    

    打印:

    ('BI', 'BER')
    ('BIB', 'ER')
    

    如果要测试某组子字符串是否可以完全组合成一个字符串:

    def builds(s, componts):
        return any(s==''.join(t) for t in it.permutations(componts))  
    
    >>> builds(s, ('R','BE','I','B'))
    True
    

    这不能处理多次重复使用不同的子字符串(例如('B','I','E','R'))为此,您可以考虑使用Trie。

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 2012-02-21
      • 1970-01-01
      • 2010-10-04
      • 2017-11-20
      • 2012-08-30
      • 2023-03-27
      • 2013-12-18
      • 1970-01-01
      相关资源
      最近更新 更多