例如,字符串“25482”,
如果按1组来分需要得到如下结果:
x25482
如果按2组来分得到如下结果:
x2548x2,
x254x82,
x25x482,
x2x5482
如果按3组来分需要得到如下结果:
x254x8x2,
x25x4x82,
x25x48x2,
x2x5x482,
x2x45,x82,
x2x548x2
不能乱序。
如果按1组来分需要得到如下结果:
x25482
如果按2组来分得到如下结果:
x2548x2,
x254x82,
x25x482,
x2x5482
如果按3组来分需要得到如下结果:
x254x8x2,
x25x4x82,
x25x48x2,
x2x5x482,
x2x45,x82,
x2x548x2
不能乱序。
{
//S: 要分的字符串;
//Count: 要分的组数
if (Count < 1 || Count > S.Length)
return null;
Collection<string> Result = new Collection<string>();
if (Count == 1)
{
Result.Add("x" + S);
return Result;
}
int L = S.Length;
int[] Pos = new int[Count + 1]; // 'x' 插入的位置,多加一个位置以便编程
for (int i = 0; i < Count; i++)
Pos[i] = i;
Pos[Count] = L;
for (; ; )
{
string R = "";
for (int i = 0; i < Count; i++)
R += "x" + S.Substring(Pos[i], Pos[i + 1] - Pos[i]);
Result.Add(R);
for (int i = 1; i < Count; i++) //检查有没有可以往后移动的
{
if (Pos[i + 1] - Pos[i] >= 2)
{ //有
Pos[i]++;
for(int j = 1; j<i; j++) //这两行是新增加的
Pos[j] = j; //
goto hesNext; //跳转到外层循环的Continue前面继续循环;
}
}
break; //没有了
hesNext: continue;
}
return Result;
}