Как наиболее эффективно определить, содержит ли строка количество последовательных повторяющихся символов в C #? - PullRequest
8 голосов
/ 20 апреля 2010

Например, пользователь ввел "Я люблю это сообщение !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

последовательный повторяющийся восклицательный знак "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" должен быть обнаружен.

Ответы [ 6 ]

3 голосов
/ 20 апреля 2010

Следующее регулярное выражение будет обнаруживать повторяющиеся символы. Вы можете увеличить число или ограничить его определенными символами, чтобы сделать его более надежным.

        int threshold = 3;
        string stringToMatch = "thisstringrepeatsss";
        string pattern = "(\\d)\\" + threshold + " + ";
        Regex r = new Regex(pattern);
        Match m = r.Match(stringToMatch);
        while(m.Success)
        {
                Console.WriteLine("character passes threshold " + m.ToString());
                m = m.NextMatch();
         }
2 голосов
/ 20 апреля 2010

Вот и пример функции, которая ищет последовательность последовательных символов указанной длины, а также игнорирует символы пробела:

    public static bool HasConsecutiveChars(string source, int sequenceLength)
    {
        if (string.IsNullOrEmpty(source))
            return false;
        if (source.Length == 1) 
            return false;

        int charCount = 1;
        for (int i = 0; i < source.Length - 1; i++)
        {
            char c = source[i];
            if (Char.IsWhiteSpace(c))
                continue;
            if (c == source[i+1])
            {
                charCount++;
                if (charCount >= sequenceLength)
                    return true;
            }
            else
                charCount = 1;
        }

        return false;
    }

Редактировать ошибку фиксированного диапазона: /

0 голосов
/ 20 апреля 2010

Используйте LINQ! (Для всего, не только для этого)

string test = "aabb";
return test.Where((item, index) => index > 0 && item.Equals(test.ElementAt(index)));
// returns "abb", where each of these items has the previous letter before it

OR

string test = "aabb";
return test.Where((item, index) => index > 0 && item.Equals(test.ElementAt(index))).Any();
// returns true
0 голосов
/ 20 апреля 2010

Вот быстрое решение, которое я создал с некоторыми дополнительными дубликатами, добавленными для хорошей меры. Как отмечали другие в комментариях, некоторые дубликаты будут полностью легитимными, поэтому вы можете захотеть сузить критерии для пунктуации вместо простых символов.

string input = "I loove this post!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!aa";

int index = -1;
int count =1;
List<string> dupes = new List<string>();

for (int i = 0; i < input.Length-1; i++)
{
    if (input[i] == input[i + 1])
    {
        if (index == -1)
            index = i;

        count++;
    }
    else if (index > -1)
    {
        dupes.Add(input.Substring(index, count));
        index = -1;
        count = 1;
    }
}

if (index > -1)
{
    dupes.Add(input.Substring(index, count));
}
0 голосов
/ 20 апреля 2010

Можно сделать в O(n) легко: для каждого символа, если предыдущий символ совпадает с текущим, увеличивает временный счет. Если это не так, сбросьте временный счет. На каждом этапе обновляйте свой глобальный файл, если это необходимо.

Для abbccc вы получаете:

a => temp = 1, global = 1
b => temp = 1, global = 1
b => temp = 2, global = 2
c => temp = 1, global = 2
c => temp = 2, global = 2
c => temp = 3, global = 3

=> c appears three times. Extend it to get the position, then you should be able to print the "ccc" substring.

Вы можете расширить это, чтобы довольно легко получить стартовую позицию, я оставлю это вам.

0 голосов
/ 20 апреля 2010

Лучший способ, по моему мнению, создать массив, каждый элемент массива отвечает за одну пару символов в строке рядом друг с другом, например, сначала aa, bb, cc, dd. Эта конструкция массива с 0 на каждый элемент.

Решить эту проблему можно с помощью этой строки и обновить значения массива. Затем вы можете проанализировать этот массив для того, что вы хотите.

Пример: Для строки: bbaaaccccdab ваш массив результатов будет {2, 1, 3}, потому что «aa» может найти 2 раза, «bb» может найти один раз (в начале строки), «cc» может найти три раза.

Почему "cc" три раза? Потому что 'cc'cc & c'cc'c & cc'cc'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...