算法问题

zqsntws 2006-02-20 01:59:49
我想做一个函数,参数为字符串和维数,从该字符串中取出给定维数的组合,例如:该字符串为“a,b,c,d”,维数为2,则返回的结果为 :"ab,ac,ad,bc,bd",如维数为3,则结果为“abc,bcd”
...全文
253 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
達魔 2006-02-22
  • 打赏
  • 举报
回复
用递归可简单的实现如下:
void f(string src, int pos, int n)
{
if(n = 0)
{
return;
}
for(int i = pos; i < str.Length - n; i++)
{
if(n = 1)
{
将src + str[i]写进数组;
}
else
{
f(src + str[i], i + 1, n -1);
}
}
}

调用方式:f("", 0, n),n换成相应的维数即可;
str是原来的字符串,你只要把这个函数封装在类中,简单调整一下应该就可以了;
zqsntws 2006-02-21
  • 打赏
  • 举报
回复
谁能给我一段程序来实现这个功能?
zqsntws 2006-02-21
  • 打赏
  • 举报
回复
抱歉,我写漏了,应该是ab,ac,ad,bc,bd,cd
達魔 2006-02-21
  • 打赏
  • 举报
回复
问题描述的不够清楚,或者是我没看明白吧:
例如:该字符串为“a,b,c,d”,维数为2,则返回的结果为 :"ab,ac,ad,bc,bd",那么"cd"是不是也在返回结果之列?
如维数为3,则结果为“abc,bcd”那么“abd,acd”也是返回结果之列?
jackymi 2006-02-21
  • 打赏
  • 举报
回复
声明 程序我没有测试过 可以用下边的阶乘公式来做
C(n,r)=n!/(r!*(n-r)!)
zqsntws 2006-02-21
  • 打赏
  • 举报
回复
jackymi(完美刺客) :你这段程序有个严重的bug: order[0]=-1;根本就进不了循环,是不是粘代码时粘错了?哪位大侠再给点建议
李世垚 2006-02-21
  • 打赏
  • 举报
回复
public ArrayList GetArray(string sTxt,int iWs)
{

ArrayList myAr=new ArrayList();
int iMax=0;
string sTmp="",sTmp2="";
string[] a=sTxt.Split(new Char [] {','});//取得最原始的元素
for (int i=0;i<a.Length;i++)//建立最初的组合
{
myAr.Add(a[i]);
}
for (int i=2;i<=iWs;i++) //依次在各组合上加元素,直道长度达到指定长度为止
{
iMax=myAr.Count;
for (int j=0;j<iMax;j++){
sTmp=myAr[j].ToString();
sTmp2=sTmp.Substring(sTmp.Length-1,1);

for (int k=0;k<a.Length;k++){//这个循环可以优化
if (String.Compare(a[k],sTmp2)>0){
myAr.Add(sTmp+a[k]);
}
}
myAr.RemoveAt(j);
j--;
iMax--;
}
}
return myAr;
}
说明 最里面的那个循环可以优化,可以使用快速查找,或者保存检索位置什么的方法优化
zqsntws 2006-02-21
  • 打赏
  • 举报
回复
点点:先谢谢了
diandian82 2006-02-21
  • 打赏
  • 举报
回复
一会有空写一个
zqhpcc 2006-02-21
  • 打赏
  • 举报
回复
看《程序员面试攻略》一书,其中就有这类问题的详解和代码。
zqsntws 2006-02-21
  • 打赏
  • 举报
回复
各位大侠帮帮忙
jackymi 2006-02-20
  • 打赏
  • 举报
回复
给你一个简单的描述

int combine(int a[],int sub){
//a[1..?]表示候选集,sub表示一个排列(组合)的元素个数
{
int total=sizeof(a);
int order[sub+1];
int count=0;//符合条件的排列(组合)的个数
order[0]=-1;
for(int i=1;i<=sub;i++)
order[i]=i;
int k=sub;
bool flag=true;
while(order[0]!=-1){
if(flag){
for(i=1;i<=sub;i++)//输出符合要求的组合
printf("%d ",a[order[i]]);
printf("\n");
count++;
flag=false;
}
order[k]++;
if(order[k]==total+1){
order[k--]=0;
continue;
}
   ...
//在此加入order[k]的限制条件
//如果条件满足,则往下执行
//否则continue;
if(k<sub){
order[++k]=order[k-1];
continue;
}
if(k==sub)
flag=true;
}
return count;
}
zqsntws 2006-02-20
  • 打赏
  • 举报
回复
各位大侠不要总说术语,我不是很懂,照顾一下我,尽量说点通俗的:)
jackymi 2006-02-20
  • 打赏
  • 举报
回复
利用回朔组合
zqsntws 2006-02-20
  • 打赏
  • 举报
回复
lovvver(春晖) ,“全排列实现”是什么意思?能否多说几句?
lovvver 2006-02-20
  • 打赏
  • 举报
回复
这个方法很简单,关键在于你的“全排列实现”的问题。
自己试一下啦~
zqsntws 2006-02-20
  • 打赏
  • 举报
回复
给个链接也中:)
zqsntws 2006-02-20
  • 打赏
  • 举报
回复
各位大侠能给个具体例子吗?
JasonHeung 2006-02-20
  • 打赏
  • 举报
回复
直接采用数学上的组合算法。字符串只是根据组合输出结果而已。组合算法网上也很多。
kehua_gao 2006-02-20
  • 打赏
  • 举报
回复
好像应该用递归
加载更多回复(1)

110,538

社区成员

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

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

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