Python Hackerrank代码周33模式计数
嗨,我一直在Hackerrank上尝试这个问题。 我曾尝试在python中使用正则表达式。但它在测试用例“1001010001”中失败。 有人能帮忙吗?它给出的输出为2,但预期输出为3。 (如10010110001所示)。python实际上是如何处理这一点的(就算法而言?)Python Hackerrank代码周33模式计数,python,regex,Python,Regex,嗨,我一直在Hackerrank上尝试这个问题。 我曾尝试在python中使用正则表达式。但它在测试用例“1001010001”中失败。 有人能帮忙吗?它给出的输出为2,但预期输出为3。 (如10010110001所示)。python实际上是如何处理这一点的(就算法而言?) 正则表达式不计算重叠的匹配项 但是,您可以轻松地修改代码,以: import re patregex=re.compile(r'10*1') text= raw_input().strip('\n') cnt = 0
正则表达式不计算重叠的匹配项 但是,您可以轻松地修改代码,以:
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)
重新导入
patregex=re.compile(r'10*1')
text=raw_input().strip('\n')
cnt=0
pos=0
match=patregex.search(文本)
比赛时:
match=patregex(文本,match.end()-1)
cnt+=1
打印(cnt)
因此,在这里,当我们找到一个匹配项
时,我们将尝试找到另一个匹配项开始,并找到上一个匹配项的匹配.end()-1
,直到找不到其他匹配项为止。我们一直这样做,直到找不到匹配项为止。对于每个匹配,我们增加cnt+=1
我们可以使用match.end()-1
,因为每个匹配都以一个1开头,后跟零个或多个0和另一个1。因此,我们知道模式只能在最后一次匹配时重新启动
这种方法还可以节省内存:因为在找到第一个匹配项后,在查找下一个匹配项时,您可以简单地忘记该匹配项。
findall(..)
方法需要同时在内存中存储所有匹配项。正则表达式不计算重叠匹配项
但是,您可以轻松地修改代码,以:
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)
重新导入
patregex=re.compile(r'10*1')
text=raw_input().strip('\n')
cnt=0
pos=0
match=patregex.search(文本)
比赛时:
match=patregex(文本,match.end()-1)
cnt+=1
打印(cnt)
因此,在这里,当我们找到一个匹配项
时,我们将尝试找到另一个匹配项开始,并找到上一个匹配项的匹配.end()-1
,直到找不到其他匹配项为止。我们一直这样做,直到找不到匹配项为止。对于每个匹配,我们增加cnt+=1
我们可以使用match.end()-1
,因为每个匹配都以一个1开头,后跟零个或多个0和另一个1。因此,我们知道模式只能在最后一次匹配时重新启动
这种方法还可以节省内存:因为在找到第一个匹配项后,在查找下一个匹配项时,您可以简单地忘记该匹配项。
findall(…)
方法需要同时将所有匹配项存储在内存中。可以通过正则表达式和前瞻模式来解决重叠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
它可以通过正则表达式和前瞻模式来解决,以捕捉重叠
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
404
当您点击链接时……请在问题正文中包含问题的基本部分。第二个挑战。正则表达式不匹配重叠部分(默认情况下)。谢谢。在正则表达式中有解决这个问题的方法吗?要解决此问题?404
当您单击链接时……请在问题正文中包含问题的基本部分。第二个挑战。正则表达式不匹配重叠部分(默认情况下)。谢谢。在正则表达式中有解决这个问题的方法吗?要解决这个问题吗?非常感谢你的帮助:)非常感谢你的帮助:)非常感谢你的帮助:)非常感谢你的帮助:)