合并的字符串检查器

时间:2019-03-25 15:08:03

标签: python python-2.7

在求职面试中,您面临的挑战是编写一种算法来检查给定的字符串s是否可以由其他两个字符串part1和part2组成。

限制是part1和part2中的字符与s中的顺序相同。

面试官为您提供以下示例,并告诉您从给定的测试用例中找出其余的内容。

例如:

'codewars'是'cdw'和'oears'的合并:

s:密码=代码战

第1部分:c d w = cdw

第2部分:OE =耳朵

P.S:我的代码无法解决问题。对于某些复杂的测试用例,它是失败的,例如“来自巴哈马的香蕉”的用例。

我试图编写代码。它传递基本字符串,例如codewars。但是对于某些复杂的测试案例,例如“来自巴哈马的香蕉”,它却失败了。

def is_merge(s, p1, p2):
    di_s={}    #Dictionary to hold the count of character in string s
    di_p={}    #Dictionary to hold the count of character in string p    
    p=p1+p2
    j=0
    k=0
    c=0
    txt=''
    for i in s:
        if i in di_s:
            di_s[i]=di_s[i]+1
        else:
            di_s[i]=1

    for i in p:
        if i in di_p:
            di_p[i]=di_p[i]+1
        else:
            di_p[i]=1



    if(di_s==di_p):    #To compare if the count of characters in s and p
        while(c<len(s)):
            if(j<len(p2)):
                if(p2[j]==s[c]):
                    txt=txt+s[c]
                    c=c+1
                    j=j+1
            if(k<len(p1)):
                if(p1[k]==s[c]):
                    txt=txt+s[c]
                    c=c+1
                    k=k+1
    else:
        return False
    if(txt==s):
        return True
    else:
        return False

如果:

s='Bananas from Bahamas'

p1='Bahas'

p2='Bananas from am'

输出应为“ True”。在给定当前字符序列的情况下,字符串p可以由p1和p2组成。

1 个答案:

答案 0 :(得分:4)

您可以使用一个函数来递归地尝试datasetsp1中的下一个字符,以匹配当前给定字符串的第一个字符,直到剩下的字符串为空为止如果其余的p2True也为空,则返回p1

p2

这样:

def is_merge(s, p1, p2):
    return \
        p1 and p1[0] == s[0] and is_merge(s[1:], p1[1:], p2) or \
        p2 and p2[0] == s[0] and is_merge(s[1:], p1, p2[1:]) or \
        False if s else not p1 and not p2

返回is_merge('codewars', 'code', 'warss') ,并且:

False

返回is_merge('codewars', 'cdw', 'oears')) ,并且:

True

返回is_merge('codewars', 'cdw', 'oear') ,并且:

False

返回is_merge('Bananas from Bahamas', 'Bahas', 'Bananas from am')

对于Truep1之间有很多重叠的情况,会导致许多不同的路径和回溯,从而导致时间复杂度呈指数级增长,但是,我们可以用一个元组的命令来记忆该函数剩余的字符串以及剩余的p2p1的冻结集来缓存结果,以便当后缀p2p1相同时,无需进一步递归因此可以作为参数交换:

p2