Любая существующая функция, которая может решить эту проблему? Вход: A B C вывод: {A}, {B}, {C}, {A B}, {B C}, {A B C}
обратите внимание, что {A C} или {C A} не являются допустимыми выходными данными.
В псевдокоде:
for (i=0 .. n-1) { for (j=i .. n-1) { ngrams.add(phase[i:j]) } }
phase[i:j] - это срез, начинающийся с i и заканчивающийся j, а n - длина (в данном случае 3)
phase[i:j]
i
j
n
A B C 0 1 2 0:0 A 0:1 AB 0:2 ABC 1:1 B 1:2 BC 2:2 C
В схеме:
(define (prefix x list) (if (null? list) nil (cons (cons x (car list)) (prefix x (cdr list))))) (define (subwords phrase) (if (null? phrase) nil (cons (list (car phrase)) (cons (prefix (car phrase) (subwords (cdr phrase))) (subwords (cdr phrase))))))
Я понял это: O (n ^ 3) алгоритм
public static void GenerateAllGrams(string query) { string[] q = query.Split(' '); int maxgram = q.Length; for (int gram = 1; gram <= maxgram; gram++) { for (int i = 0; i < q.Length - gram + 1; i++) { string current = ""; for (int j = i; j < i + gram; j++) { current += q[j] + " "; } Console.WriteLine(current.Trim()); } } }