求助集合划分算法

mousedl 2012-05-13 10:48:10
例如,字符串“25482”,
如果按1组来分需要得到如下结果:
x25482
如果按2组来分得到如下结果:
x2548x2,
x254x82,
x25x482,
x2x5482
如果按3组来分需要得到如下结果:
x254x8x2,
x25x4x82,
x25x48x2,
x2x5x482,
x2x45,x82,
x2x548x2
不能乱序。
...全文
251 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
山谷居士 2012-05-14
  • 打赏
  • 举报
回复
static public Collection<string> Divid(string S, int Count)
{
//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;
}
xxoo2007 2012-05-14
  • 打赏
  • 举报
回复
简单的二叉树遍历算法咯。

换个角度考虑,例如要分三组,过程上就是先分成两组,再把第二组分成两组。无论分成几组都可以,因为1+1=2 1+2=3,三生万物。所有的可能性列出就是答案了。

写法上应该是用递归,函数基本上SubString就够用了
mousedl 2012-05-14
  • 打赏
  • 举报
回复
两种方式都可以 非常感谢!!!
threenewbee 2012-05-14
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = "25482";
int n = 2;

var data = Enumerable.Range(1, s.Length - 1);
IEnumerable<int[]> query = data.Select(x => new int[] { x });
for (int i = 1; i < n; i++)
{
query = query.SelectMany(x => data.Select(y => x.Concat(new int[] { y }).ToArray()));
}
query = query
.Select(x => x.OrderBy(y => y).Distinct().ToArray())
.Where(x => x.Count() == n - 1)
.OrderByDescending(x => string.Join(",", x))
.GroupBy(x => string.Join(",", x))
.Select(x => x.First())
.Select(x => new int[] { 0 }.Concat(x).ToArray());
foreach (var item in query)
{
Console.WriteLine(string.Join("", s.Select((x, i) => item.Contains(i) ? "x" + x : x.ToString())));
}
}
}
}
mousedl 2012-05-13
  • 打赏
  • 举报
回复
哎 ,还在想代码怎么写,头大 。。。
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
根据字符串的长度,for循环应该可以出来的..
mousedl 2012-05-13
  • 打赏
  • 举报
回复
比如123的话,划分2组出来就有这些:1/23,12/3,不能是13/2
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
....你把思路理顺,总结出规律,代码就自然出来了.
mousedl 2012-05-13
  • 打赏
  • 举报
回复
有一个元素就可以为一组
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
划分的规律是神马嘛?当满足什么条件才能算一组呢?
mousedl 2012-05-13
  • 打赏
  • 举报
回复
上面我只是举例,就是集合划分,只是不能打乱顺序,5个字符,3组的话是这样:
{{2}{5}{482}}
{{2}{54}{82}}
{{2}{548}{2}}
{{25}{4}{82}}
{{25}{48}{2}}
{{254}{8}{2}}
这样看上去是不是直观点了,哎 不知道怎么写代码。。。。
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
按2组的规律我是看懂了,按3组分那个规律我还真没摸出来.
mousedl 2012-05-13
  • 打赏
  • 举报
回复
肯定不是写死的 就是输入字符串和指定划分子集合个数,输出所有子集合。
加旋仔 2012-05-13
  • 打赏
  • 举报
回复
你是想要写死还是怎么的,不想写死得把规律总结出来阿.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧