Hackerrank周代码33模式计数

时间:2017-06-18 13:06:58

标签: python regex

您好我一直在Hackerrank上尝试这个问题。 我试过在python中使用正则表达式。但它在测试案例中失败了#100; 1001010001"。 有人可以帮忙吗?它将输出设为2,但预期输出为3。 (如1001 101 10001)。 python如何实际处理这个问题(就算法而言?)

https://www.hackerrank.com/contests/w33/challenges/pattern-count

var menuMmainScroll = $(window).scrollTop();

if(menuMmainScroll === 0) {
    $(".flags").css("margin-top", "24px");
}
else {
    $(".flags").css("margin-top", "10px");
}

2 个答案:

答案 0 :(得分:1)

正则表达式不计算重叠匹配

然而,您可以轻松地修改代码:

import re

patregex=re.compile(r'10*1')

text= raw_input().strip('\n')

cnt = 0
pos = 0
match = patregex.search(text)
while match:
    match = patregex(text,match.end()-1)
    cnt += 1
print(cnt)

所以,当我们找到match时,我们会尝试找到另一个匹配开始和前一个匹配的match.end()-1,直到找不到其他匹配为止。我们这样做直到找不到匹配为止。对于每个匹配,我们增加cnt += 1

我们可以使用match.end()-1,因为每个匹配都以1开头,后跟0或更多0以及另外1个。所以我们知道该模式在最后一次匹配时只能重新启动。 / p>

这种方法还可以节省内存:因为在找到第一场比赛后,你可以在寻找下一场比赛时忘掉那场比赛。 findall(..)方法需要同时在内存中存储所有匹配项。

答案 1 :(得分:1)

它可以通过正则表达式和前瞻模式来解决,以捕捉重叠1的情况:

import re

def count_code33(input_string):
    return len(re.findall('10*(?=1)', input_string))

# Test section    
def test(input_string):
    print('{!r} => {}'.format(input_string, count_code33(input_string)))

test('')
test('0')
test('10')
test('1001010001')
test('1001 101 10001')
test('100110110001')
test('1111')

结果:

'' => 0
'0' => 0
'10' => 0
'1001010001' => 3
'1001 101 10001' => 3
'100110110001' => 5
'1111' => 3