2016-06-17 4 views
-1

Вопрос: У меня длинная строка, и мне нужно найти счетчик вхождений всех подстрок, присутствующих в этой строке, и распечатать список всех подстрок и их счетчик (если count> 1) в порядке убывания количества.Для подсчета вхождений всех подстрок в строке C#

Пример:

String = "abcdabcd" 

Результат:

Substrings  Count 
abcd   2 
abc    2 
bcd    2 
ab    2 
bc    2 
cd    2 
a    2 
b    2 
c    2 
d    2 

Проблема: Строка может быть 5000 символов долго, и я не в состоянии найти эффективный способ для достижения этой цели (КПД очень важно. для применения)

Есть ли какой-либо алгоритм или многопоточность, это возможно. пожалуйста помоги.

+1

Пожалуйста, посмотрите на * дерево суффиксов * или/и * Суффикс массив * https://en.wikipedia.org/ wiki/Suffix_array –

+0

@DmitryBychenko: Я пробовал с деревом суффиксов и суффиксным массивом, но из дерева суффиксов не удается найти все подстроки. Однако, если подстрочная строка задана в качестве входных данных, вы можете очень быстро найти ее количество в суффиксном дереве. –

+0

Возможный дубликат [Найти общую строку в списке строк] (http://stackoverflow.com/questions/13509277/find-a-common-string-within-a-list-of-strings) – Clint

ответ

0

Пример использования: Find a common string within a list of strings

void Main() 
{ 
    "abcdabcd".getAllSubstrings() 
     .AsParallel() 
     .GroupBy(x => x) 
     .Select(g => new {g.Key, count=g.Count()}) 
     .Dump(); 
} 

// Define other methods and classes here 

public static class Ext 
{ 
    public static IEnumerable<string> getAllSubstrings(this string word) 
    { 
     return from charIndex1 in Enumerable.Range(0, word.Length) 
      from charIndex2 in Enumerable.Range(0, word.Length - charIndex1 + 1) 
      where charIndex2 > 0 
      select word.Substring(charIndex1, charIndex2); 
    } 
} 

Производит:

a 2 
dabc 1 
abcdabc 1 
b 2 
abc 2 
dabcd 1 
bc 2 
bcda 1 
abcd 2 
ab 2 
bcdab 1 
cdabc 1 
abcda 1 
d 2 
bcdabc 1 
dab 1 
bcd 2 
abcdab 1 
c 2 
bcdabcd 1 
abcdabcd 1 
cd 2 
da 1 
cdab 1 
cda 1 
cdabcd 1 
+0

Он работает хорошо для строки длиной 1000 символов, но дает исключение из памяти для длины строки более 2000. Ошибка при входе в строку «select word.Substring (charIndex1, charIndex2);» Любые предложения? –

+0

Строки @NancyGarg, которые значительны, неизбежно будут вызывать ошибки OOM, многие операторы серии быстро создают множество массивов; мое предложение состояло бы в том, чтобы взять общий принцип, но использовать другую структуру для работы со строкой - построитель строк/ролл что-то другое. – Clint

+1

Я сменил 32-битный компилятор на 64 бит, и он сработал. Это также очень эффективно по сравнению с моим предыдущим подходом. Спасибо тонну .. :) –

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