Определить есть ли три подряд стоящих одинаковых символа в строке

Рейтинг: 2Ответов: 2Опубликовано: 12.09.2014

Вводится строка, если в ней есть 3 подряд стоящих одинаковых символа, то надо вывести NO, если нет - YES

Ответы

▲ 5Принят

Регулярные выражения спешат на помощь!

import re

str1 = 'qwerty'
str2 = 'qwerttty'

regex = re.compile(r'^.*(.)(\1)(\1).*$')

print 'YES' if regex.match(str1) else 'NO'
print 'YES' if regex.match(str2) else 'NO'

А ваша программа не работает потому что в срезе, который вы берёте на каждой итерации всего 2 элемента.

>>> s = [1, 2, 3, 4, 5]
>>> i = 2
>>> j = 0
>>> s[j:i]
[1, 2]

Ну, или как-то так:

same3 = lambda s: min([len(x) for x in [set(x) for x in [s[x:x+3] for x in range(len(s) - 2)]]]) == 1

same3('qwerty')    // False
same3('qwerttty')  // True

Да! Я сделал это! Я написал программу, менее читабельную, чем регулярка, которой она эквивалентна!

А если серьёзно, эта программа делает следующее:

s = 'qwerty'

triplets = [s[x:x+3] for x in range(len(s) - 2)]
// находим все тройки подряд идущих символов
// для `qwerty` получим ['qwe', 'wer', 'ert', 'rty']

sets = [set(x) for x in triplets]
// каждую тройку преобразуем в множество (set)
// особенность множества - в нём нет повторяющихся элементов

lengths = [len(x) for x in sets]
// вычисляем размер каждого множества
// если размер какого-либо множества равен 1, то все элементы, входящие в него, равны

minlen = min(lengths)
// находим множество минимальной длины

print minlen == 1

Ну, и объявление функции same3 = lambda s: ... эквивалентно классическому:

def same3(s):
    ...
▲ 0

Вводится строка, если в ней есть 3 подряд стоящих одинаковых символа, то надо вывести NO, если нет - YES

import re

print("NO" if re.search(r"(.)" + r"\1" * (3 - 1), s) else "YES")

Или без регулярных выражений:

from itertools import groupby

print("NO" if any(len(list(dups)) > (3 - 1) for _, dups in groupby(s)) else "YES")