【问题标题】:Checking interweaving strings in pythonic way以pythonic方式检查交织字符串
【发布时间】:2021-06-16 18:25:29
【问题描述】:

我在检查交织字符串时遇到问题。所以,我有3个字符串,我需要检查是否可以将前两个字符串交织形成第三个字符串。

为了简化,交织字符串意味着通过交替它们的字母来合并它们而没有任何特定的模式。

例如:"abc""123" 是两个字符串,可能的交织可以是 "abc123""a1b2c3""ab1c23" 等混合它们,没有任何模式,但遵循顺序。

另一个例子,假的情况:

str1 = "aabcc", 
str2 = "dbbca", 
str3 = "aadbbbaccc"  # This is false case, where str3 is not interweaving from str1 and str2

我尝试过的:

我尝试了以下对我有用的解决方案。返回True 如果字符串c 是字符串ab 的交织,否则返回False

def weavingstring(a,b,c):
    for i in c:
        if len(a)>0:
            if i == a[0]:
                a=a[1:]
        if len(b)>0:
            if i == b[0]:
                b=b[1:]
    if len(a) > 0 or len(b) > 0:
        return False
    return True
            

print(weavingstring("abc", "def", "abcdef"))  # True here
print(weavingstring("aabcc", "dbbca", "aadbbbaccc"))  # False here

我想要什么

我有正常的解决方案,我想知道使用list comprehensionmapfilterreducelambda functions 等是否有任何pythonic 方式。

【问题讨论】:

    标签: python python-3.x lambda mapreduce list-comprehension


    【解决方案1】:

    lru_cachelambda 一起使用来加快速度的一种方法:

    from functools import lru_cache
    class Solution:
        def isInterleave(self, s1: str, s2: str, s3: str) -> bool:
            return (memo:=lru_cache()
                ( lambda i=0, j=0, k=0:
                    (i, j, k) == (len(s1), len(s2), len(s3))
                    or ( i < len(s1) and k < len(s3) and s1[i] == s3[k] and memo( i+1, j, k+1 ) )
                    or ( j < len(s2) and k < len(s3) and s2[j] == s3[k] and memo( i, j+1, k+1 ) ) )
            )()
            
    

    【讨论】:

    • 感谢您提供此解决方案,lru_cache 的任何文档链接?
    • 我认为您更喜欢其中一种方法 - map、filter、reduce、lambda ...?
    • 是的,我更喜欢这些。感谢您提供文档链接。
    【解决方案2】:

    您可以对一个简单的递归解决方案感兴趣吗?

    def weaving(a: str, b: str, res: str) -> bool:
        if not a: return b == res
        if not b: return a == res
        if not res: return False
        if res[0] == a[0]:
            return weaving(a[1:], b, res[1:])
        elif res[0] == b[0]:
            return weaving(a, b[1:], res[1:])
        else:
            return False
    

    【讨论】:

      【解决方案3】:

      一个简单的解决方案是使用正则表达式。

      import re
      def iswoven(first, second, test):
          return all((re.search(r'.*'.join(x), test) for x in (first, second)))
      
      
      >>> iswoven('abc', '123', 'a1b2c23')
      True
      >>> iswoven('abc', '123', 'a1b223')
      False
      
      

      这将检查测试字符串是否匹配 'a.*b.*c' 和 '1.*2.*3' 并返回结果。

      根据字符串的长度,这最终可能会尝试匹配一些非常复杂的正则表达式,所以买家要小心。

      【讨论】:

      • 这行不通 - 试试这个例子: print(iswoven('abcd', 'ABBCCDE', 'abABcBCCcDEd')) # 是吗?
      • 基于 OP 的初始帖子和示例,我将“交织字符串”的标准设为 字符串 3 包含字符串 1 和 2 中的每个字母,它们的出现顺序与它们出现的顺序相同,可能是穿插的。 但是,OP 没有说明符合上述标准的字符串还包含其他字符,而这些字符既没有出现在字符串 1 也没有出现在字符串 2 中。根据接受的答案,我相信 OP 的意图是指定一个标准,例如 String 3 仅包含字符串 1 和 2 中的字母,它们的出现顺序与它们出现的顺序相同,可能是穿插的。
      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 2010-12-12
      • 1970-01-01
      • 2013-09-02
      • 2016-04-17
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      相关资源
      最近更新 更多