public class Program { static List<string[]> s_result = new List<string[]>(); static Stack<string> s_current = new Stack<string>(); static void Main(string[] args) { string s = "25482"; int groupCount = 3; Part(s, groupCount); foreach (var r in s_result) { Console.WriteLine(string.Join("|", r)); } Console.Read(); } static void Part(string s, int groupCount) { if (groupCount == 1) { s_current.Push(s); s_result.Add(s_current.Reverse().ToArray()); s_current.Pop(); return; } for (int p = 1; p <= s.Length - groupCount + 1; p++) { s_current.Push(s.Substring(0, p)); Part(s.Substring(p, s.Length - p), groupCount - 1); s_current.Pop(); } } }
你是想说:
对于任意的N(N>1)个字符组成的字符串,用M(N>M>=0 )个分割符来分割,求可分割的方法有多少个吧?
定义一个函数f(n,m)表示可以划分的方法数量,那么,第一个分割符号总共可放置的位置的数量为f1(n,m)=n-m+1个分别为p(1), p(2), ..., p(n-m+1),于是,f(n,m)=(f(n-1,m-1)) + f(n-2, m-1) + ... + f(n-m, m-1)
然后,你把这个算法完善就OK了。
(呵呵,数据忘光了,而且马上要睡觉了,我上面的数据分析还需要推敲,暂且贴出来,权当引玉之砖,希望能对你有所启发。这个问题的解决关键是建立数学模型,大致的建立方法就是我这个样子,然后确定一个当n、m在什么情况下终止的结束条件,以递归的方式调用计算得到最终结果。)
呵呵,感谢各位园子兄弟支持,“水牛刀刀”的代码是正确的,非常感谢 ,牛人!!
@mousedl: 明白了一个道理:授人以渔不如授人以鱼!