stringbreak[str_] := (
StringJoin[#[[All, 1]]] & /@
GatherBy[Transpose[{Characters[str],
Accumulate@#}], #[[2]] & ] & /@
Nest[ Flatten[ If[Last@# == 0, {Append[#, 1]},
{Append[#, 0], Append[#, 1]}] & /@ # , 1] &, {{1}},# -1]) &@
StringLength[str]
stringbreak["123456" ]
{{"12", "34", "56"}, {"12", "34", "5", "6"}, {"12", "3", "45",
"6"}, {"12", "3", "4", "56"}, {"12", "3", "4", "5", "6"}, {"1",
"23", "45", "6"}, {"1", "23", "4", "56"}, {"1", "23", "4", "5",
"6"}, {"1", "2", "34", "56"}, {"1", "2", "34", "5", "6"}, {"1", "2",
"3", "45", "6"}, {"1", "2", "3", "4", "56"}, {"1", "2", "3", "4",
"5", "6"}}
stringbreak["12345678901234567890" ] // Timing // First
stringbreak["12345678901234567890" ] // Length
0.546
10946
Extension to arbitraty max run length:
stringbreak[str_, runlen_] :=
StringJoin[#[[All, 1]]] & /@
GatherBy[Transpose@{Characters@str, #}, Last ] & /@
Nest[Flatten[ {Append[#, Last@# + 1],
If[Length@# > runlen - 1 && Length@Union@#[[-runlen ;;]] == 1 ,
Sequence @@ {}, Append[#, Last@#]]} & /@ #, 1] &, {{0}},
StringLength[str] - 1]
stringbreak["123456", 10]
{{"123456"}, {"12345", "6"}, {"1234", "56"}, {"1234", "5",
"6"}, {"123", "456"}, {"123", "45", "6"}, {"123", "4",
"56"}, {"123", "4", "5", "6"}, {"12", "3456"}, {"12", "345",
"6"}, {"12", "34", "56"}, {"12", "34", "5", "6"}, {"12", "3",
"456"}, {"12", "3", "45", "6"}, {"12", "3", "4", "56"}, {"12", "3",
"4", "5", "6"}, {"1", "23456"}, {"1", "2345", "6"}, {"1", "234",
"56"}, {"1", "234", "5", "6"}, {"1", "23", "456"}, {"1", "23", "45",
"6"}, {"1", "23", "4", "56"}, {"1", "23", "4", "5", "6"}, {"1",
"2", "3456"}, {"1", "2", "345", "6"}, {"1", "2", "34", "56"}, {"1",
"2", "34", "5", "6"}, {"1", "2", "3", "456"}, {"1", "2", "3", "45",
"6"}, {"1", "2", "3", "4", "56"}, {"1", "2", "3", "4", "5", "6"}}
brute force just for fun..
Function[str, Select[ Permutations[
Join[ StringJoin /@ Partition[ # , 2, 1] , #] &@Characters[str] ,
StringLength[str]] , StringJoin@# == str & ]]@"123456"
same, way slower.