Я думаю, что мне нравится это больше всего:
set = {"a", "b", "c", "d"};
ReplaceList[set, {___, x__, ___} :> {x}]
С присоединением строки:
ReplaceList[set, {___, x__, ___} :> "" <> Riffle[{x}, " "]]
В том же духе, специфично для строк:
StringCases["abcd", __, Overlaps -> All]
Так как Насер говорит, что я обманываю, вот более ручной подход, который также имеет большую эффективность на больших сетах:
ClearAll[f, f2]
f[i_][x_] := NestList[i, x, Length@x - 1]
f2[set_] := Join @@ ( f[Most] /@ f[Rest][set] )
f2[{"a", "b", "c", "d"}]