Python-合并的字符串检查器-Codewars

时间:2018-12-03 15:39:16

标签: python

有一个简单的练习:

在求职面试中,您面临编写一个算法来检查给定字符串s是否可以由其他两个字符串part1和part2构成的挑战。 限制是part1和part2中的字符与s中的顺序相同。 面试官为您提供以下示例,并告诉您从给定的测试用例中找出其余的内容。

例如:

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

s:密码=代码战

part1:c d w = cdw

第2部分:OE =耳朵

好的,所以我的代码是:

  def is_merge(s, part1, part2):
      if len(s) != (len(part1) + len(part2)):
          return False
      l= list(s)
      p1=list(part1)
      p2=list(part2)
      l= sorted(l)
      result= p1+p2
      result= sorted(result)
      if result == l:
          return True

所以55/66结果是正确的,但是在11种情况下,存在以下特定错误:

现在是错误(我知道它们不够详细,但这就是本代码战练习所告诉我的)

 is_merge
 can handle characters in wrong order:
#codewars can't be created from code and wasr
#codewars is not a merge of cwdr and oeas

 can handle some random cases (11 of 20 Assertions)(here are 9 errors where they all say:
#Can we merge it? No, we can't: None should equal False)

有任何提示,以便我可以找出我在这段代码中写错了什么还是没有添加什么?

4 个答案:

答案 0 :(得分:1)

在函数的核心中,您可以尝试这样的循环:

part1_index = 0
part2_index = 0
for c in l:
    if part1_index < len(p1) and c == p1[part1_index]:
        part1_index += 1
    elif part2_index < len(p2) and c == p2[part2_index]:
        part2_index += 1
    else:
        return False

return True

答案 1 :(得分:0)

订单很重要-做sorted(l)sorted(result)会导致订单被打乱,从而导致订单被破坏。

如果我理解正确,

  

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

意味着您需要依次遍历part1part2

那可以解释为什么会得到

的错误
  

无法通过代码和wasr创建代码战

答案 2 :(得分:0)

如上所述,字母顺序很重要。您可以使用find在字符串中找到字符的第一个位置。此功能有效,但如果所需单词重复的字符会中断:

def is_merge(s, part1, part2):
    if len(s) != (len(part1) + len(part2)):
        return False

    # where are the characters in the desired string?
    part1_pos = [s.find(x) for x in part1]
    part2_pos = [s.find(x) for x in part2]

    # are they in order? i.e. does the position keep increasing? 
    part1_increases = [x < y for x,y in zip(part1_pos,part1_pos[1:])]
    part2_increases = [x < y for x,y in zip(part2_pos,part2_pos[1:])]

    # these prints will show you what is going on ...
    print(part1_pos,part1_increases)
    print(part2_pos,part2_increases)


    if all(part1_increases) and all(part2_increases):
        return True

    return False

答案 3 :(得分:0)

def is_merge(s, s1, s2):
    for c in s:
        if s1.startswith(c):
            s1 = s1[1:]
        elif s2.startswith(c):
            s2 = s2[1:]
        else:
            return False
    else:
        if s1 or s2:           # still characters left in s1 or s2
            return False
    return True