您好我一直在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");
}
答案 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