Кажется, что если вы ищете обратное, эта проблема становится очень простой.
Любые входные данные, содержащие любые символы, отличные от a
, c
или t
, не совпадают.
Тогда, кроме aa
, мы никогда не увидим повторение одного и того же персонажа. Однако aa
может быть только в конце строки .
Чтобы решить aa
, мы можем заменить любой aa
в конце укуса одним a
, так как они грамматически оба одинаковы.
Затем мы можем просто найти aa
, cc
и tt
и потерпеть неудачу при любых совпадениях.
import re
test_strings = {
'cat' : True,
'act' : True,
'tac' : True,
'at' : True,
'aa' : True,
't' : True,
'acta' : True,
'taca' : True,
'a' : True,
'aaa' : False,
'ataa' : True,
'aataa' : False,
'tacca' : False,
'iii' : False,
'abcd' : False,
'catk' : False,
'ab' : False,
'catcat' : True,
'cat' * 40000 : True,
'actact' : True,
}
for t, v in test_strings.items():
if not re.search("^[atc]*$", t):
continue;
temp = re.sub("aa$", "A", t)
if re.search("^aa|aA|cc|tt", temp):
print('no match(%r): %s' % (v, t))
else:
print('match(%r): %s' % (v, t))
В приведенном выше коде я заменяю aa
на A
, но использование a
также будет работать.
или в рубине
test_strings = {
'cat' => true,
'act' => true,
'tac' => true,
'at' => true,
'aa' => true,
't' => true,
'acta' => true,
'taca' => true,
'a' => true,
'aaa' => false,
'ataa' => true,
'aataa' => false,
'tacca' => false,
'iii' => false,
'abcd' => false,
'catk' => false,
'ab' => false,
'catcat' => true,
'cat' * 40000 => true,
'actact' => true,
}
test_strings.each do |t, v|
temp = t.dup
if !temp.match(/^[atc]*$/)
puts('No match: ' + t + ' ' + temp)
next;
end
temp.sub!(/aa$/, 'A');
if temp.match(/aA|aa|tt|cc/)
puts('no match: ' + t[0..80])
puts "Wrong" if v
else
puts('match: ' + t[0..80])
puts "Wrong" unless v
end
end