2016-04-17 2 views
1

Я пытаюсь сделать функцию в Octave, чтобы проверить, содержит ли строка три последовательных одинаковых символа. То есть, если моя строка "asdf" она должна возвращать 0 и если это так "asdfffg" он должен вернуть 1. То, что я до сих пор этоПроверьте, содержит ли строка три одинаковые буквы в Octave

if(length(findstr(word,"aaa",0)) > 1 || length(findstr(word,"bbb",0)) > 1 || .. 

Это дорого, и я думаю, что не то, что на самом деле неэффективным. Какие-либо предложения?

ответ

3

Используйте регулярное выражение:

match = regexp(word, '(.)\1{2}', 'once'); 

Это означает: любой символ ((.)), а затем тот же символ (\1) дважды ({2}). Он вернет начальный индекс первого совпадения или пустой массив, если нет совпадения. Таким образом, ваш желаемый результат будет

result = ~isempty(match); 

Другая возможность состоит в том, чтобы использовать свертку:

result = any(conv([1 1], +~diff(word))==2); 

Это работает следующим образом: diff даст 0, когда два последовательных символа являются одинаковыми. Поэтому вы хотите определить, содержит ли вывод diff два последовательных нули. Это делается путем отрицания (~), конвертирования в double (+), свертки с последовательностью [1 1] (conv([1 1], ...)), и если 2 присутствует в выводе.

+1

Любить трюки для гольфа во втором ответе. Я лично предпочитаю ['llhjd ~ X + 2 = a'] (http://matl.tryitonline.net/#code=bGxoamR-WCsyPWE&input=YWFhYWJiYw) :) – Suever

+0

@Suever или' TTjd ~ X + 2 = a', может быть? :-P –

+1

Я понятия не имел, что значения T/F связаны таким образом. Отметил! – Suever

Смежные вопросы