在求职面试中,您面临的挑战是编写一种算法来检查给定的字符串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组成。
答案 0 :(得分:4)
您可以使用一个函数来递归地尝试datasets
和p1
中的下一个字符,以匹配当前给定字符串的第一个字符,直到剩下的字符串为空为止如果其余的p2
和True
也为空,则返回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')
。
对于True
和p1
之间有很多重叠的情况,会导致许多不同的路径和回溯,从而导致时间复杂度呈指数级增长,但是,我们可以用一个元组的命令来记忆该函数剩余的字符串以及剩余的p2
和p1
的冻结集来缓存结果,以便当后缀p2
与p1
相同时,无需进一步递归因此可以作为参数交换:
p2