捣腾一上午了,没写出来,算法问题,全部身家了

liherun 2009-12-16 02:57:53
如果string str="abc";要求输出ab,ac,bc,abc
如果string str="abcd";要求输出ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd,
如果string str="abcde";要求输出ab,ac,ad,ae,bc,bd,be,cd,ce,de,abc,abd,abe,acd,ace,ade,bcd,bce,bde,cde,abcd,abce,abde,acde,bcde
字符串的长度不确定,但大于等于2
...全文
682 93 打赏 收藏 转发到动态 举报
写回复
用AI写文章
93 条回复
切换为时间正序
请发表友善的回复…
发表回复
oasistree 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 windseekerneo 的回复:]
引用 34 楼 jerryjbiao 的回复:
这是算法中的组合问题,你可以采用递归算法来实现


学习了,怎么我就想不到呢?
之前我也遇到过一个类似的问题,但是我是用了多重循环的穷举...

我的想法是,最终可以分解成选择两个元素的问题,只不过第一个可以是单个字符,第二个可能是一个字符串了.
[/Quote]
我也是这个思路,等明天写这练练
oasistree 2009-12-17
  • 打赏
  • 举报
回复
试了递归,有子集重复的问题,还要去重,还不如直接循环
elainte 2009-12-17
  • 打赏
  • 举报
回复
jf
高手真多...
fyanglexh 2009-12-17
  • 打赏
  • 举报
回复

private StringBuilder RepComponent(string str,StringBuilder sRet)
{
if (str.Length <= 1)
return sRet;
string s = str.Substring(0, 1);
for (int i = 1; i < str.Length; i++)
{
sRet.Append(s + str[i] + ",");
}
if (str.Length > 2)
{
sRet.Append(str + ",");
}
sRet = RepComponent(str.Substring(1), sRet);
return sRet;
}

呵呵,楼主接贴速度真快。把我的思路贴上供参考。。。
hzxsasdfgh 2009-12-17
  • 打赏
  • 举报
回复
上面我是举得例子是如果为1234,呵呵!忘记写上去了
hzxsasdfgh 2009-12-17
  • 打赏
  • 举报
回复
有人可能看不懂63的代码:我帮忙翻译成人类能理解的形式~!^_^!~
int iLen = sIn.Length;//这个取要组合字符串的长度
if (iLen <= 2)//如果小于2直接输出来
Console.WriteLine(sIn);//输出
char[] cALL = sIn.ToCharArray();//把它用一个个字符装进去一个数组离去

Hashtable htRank = new Hashtable();//创建哈希表
htRank.Add(Convert.ToInt64(0), 0);//添加一个0,0第一个是键,第2个是值
for (int r = 0; r < iLen; r++)//循环数组
{
htRank.Add(Convert.ToInt64(Math.Pow(2, r)), r);//添加键为1,2,4,8...
//值为0,1,2,3
}

string sTmp = string.Empty;//先设为空
BitArray ba = null;//先设为空值
for (int i = 0; i < Math.Pow(2, iLen); i++)//又是循环1,2,4,8...
{
if (!htRank.Contains(Convert.ToInt64(i)))//将不是哈希表中值为1,2,4,8的
//提取出来即0,3,5,6,7,9...
{
sTmp = string.Empty;//还是设为空
ba = new BitArray(BitConverter.GetBytes(i));//这个就有讲究了^_^
//再次我简单举例一下:如果是6的话,6/2=3 为0,3/2=1 为1
//那么就为 011 记住是011哦!下面就有用了!

for (int j = 0; j < ba.Length; j++)//ba.length一般为32(如果是INT类
//型的话)BITARRAY()里面的值不是
//true,就是FALSE
{
if (ba[j])//如果值为6的话(举例)是011 J=0 FALSE,J=1TURE call[1]
//是多少?当然是2, j=2 true call[2] 是多少? 当然是 3哈哈,就这样!下面的STMP就来累加,2,3当然就是输出23了一次类推~哈哈,
sTmp += cALL[j].ToString();//那么这边取值是多少
}
Console.WriteLine(sTmp);
}
}
liherun 2009-12-17
  • 打赏
  • 举报
回复
看看能不能用下标写出来
liherun 2009-12-17
  • 打赏
  • 举报
回复
高人这么多。。学习了,马上结贴
liherun 2009-12-17
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 awpszq 的回复:]
LZ会写小九九么?
把str拆开
类似小九九的方式输出
string类型的值相加的结果 例如a+b 得到的是ab 1+2得到的是12
有点思路没有??
[/Quote]
你用写小99的方法写个给我看看
Gannar_peng 2009-12-17
  • 打赏
  • 举报
回复
先好好想想
bingo_ 2009-12-17
  • 打赏
  • 举报
回复
不对了 没有考虑间隔的 ~ OH~
bingo_ 2009-12-17
  • 打赏
  • 举报
回复

string[] str = { "", "a", "b", "c", "d", "e","f","g" };

掉引号了
bingo_ 2009-12-17
  • 打赏
  • 举报
回复

string[] str = { "", "a", "b", "c", "d", "e","f",g" };

int L = str.Length - 1;
string T = "";
for (int i = 1; i < L; i++)
{
T = str[i];
for (int j = i; j < L; j++)
{
if (j > i) T += str[j];
for (int k = j; k < L; k++)
Console.WriteLine(T + str[k + 1]);
}
}
jiangshun 2009-12-17
  • 打赏
  • 举报
回复
刚把我写的转到我博客了,有兴趣的可以看看!
jiangshun 2009-12-17
  • 打赏
  • 举报
回复
开始以为是标题党,上午看到标题就没进去看,晚上无意中点到了
这个问题我以前也想过,一直考虑的是取字符的下标来确定,没想出来。

通过字符串截取很容易解决上面的问题!




string str = "ABCDEFG";
for (int num = 1; num < str.Length; num++)
{
for (int i = 0; i < str.Length; i++)
{
for (int j = i + 1; j < str.Length; j++)
{
int count = num - 1 + j;
if (count < str.Length)
Console.WriteLine(str.Substring(i, num) + str.Substring(count, 1));
}
}
}
/*
------输出结果------------
AB
AC
AD
AE
AF
AG
BC
BD
BE
BF
BG
CD
CE
CF
CG
DE
DF
DG
EF
EG
FG
ABC
ABD
ABE
ABF
ABG
BCD
BCE
BCF
BCG
CDE
CDF
CDG
DEF
DEG
EFG
ABCD
ABCE
ABCF
ABCG
BCDE
BCDF
BCDG
CDEF
CDEG
DEFG
ABCDE
ABCDF
ABCDG
BCDEF
BCDEG
CDEFG
ABCDEF
ABCDEG
BCDEFG
ABCDEFG
*/
tianmao111 2009-12-17
  • 打赏
  • 举报
回复
其实就是个递归算法问题,写一个函数,在写一个循环,循环里调用函数,给函数传参,继续调用
awpszq 2009-12-16
  • 打赏
  • 举报
回复
LZ会写小九九么?
把str拆开
类似小九九的方式输出
string类型的值相加的结果 例如a+b 得到的是ab 1+2得到的是12
有点思路没有??
blice 2009-12-16
  • 打赏
  • 举报
回复
[Quote=引用 73 楼 blice 的回复:]
班门弄斧一下
新手,用数组写一个
MAX定义最大长度
试过,还可以吧。
C/C++ code
#include"stdio.h"
#include"string.h"#define MAX 10void main()
{char a[MAX+1];int i=0,j=i+1,k=j-1,l,s,b=0;
scanf("%s",a);
s=strlen(a);while(i<s-1)
{if(k++>=s-1)
{if(++j!=s)
{
k=j;
}else
{
i++;
j=i+1;
k=j;
}
}for(l=i;(l<j)&&(i!=s-1);l++)
{
printf("%c",a[l]);
b=1;
}if(b==1)
printf("%c,",a[k]);
b=0;
}
}
[/Quote]
我这层楼的。顺便说一下,只是针对含有的元素(字符)不相同的。若输入出现相同的如aba则认为有三个不同的字符。没有检测功能。并且输出的方式和其他人的不同
但是如果假设字符全部相同,效率还可以。改了一下MAX的值,当有25个输入的时候,测试了一下。用时0.054945。
iishou88 2009-12-16
  • 打赏
  • 举报
回复
顶 学习
zzxap 2009-12-16
  • 打赏
  • 举报
回复


static string[] m_Data = { "A", "B", "C", "D", "E" };
static void Main(string[] args)
{
Dictionary<string, int> dic = new Dictionary<string, int>();
for (int i = 0; i < m_Data.Length; i++)
{

dic.Add(m_Data[i], i);
}
GetString(dic);
Console.ReadLine();
}
static void GetString(Dictionary<string, int> dd)
{
Dictionary<string, int> dic = new Dictionary<string, int>();
foreach (KeyValuePair<string, int> kv in dd)
{
for (int i = kv.Value + 1; i < m_Data.Length; i++)
{
//Console.WriteLine(kv.Key + " " + kv.Value + " " + i);
Console.WriteLine(kv.Key + m_Data[i]);
dic.Add(kv.Key + m_Data[i], i);
}
}
//Console.WriteLine(dic.Count);
if (dic.Count > 0) GetString(dic);
}
================================
运行结果:
A
B
C
D
E
AB
AC
AD
AE
BC
BD
BE
CD
CE
DE
ABC
ABD
ABE
ACD
ACE
ADE
BCD
BCE
BDE
CDE
ABCD
ABCE
ABDE
ACDE
BCDE
ABCDE

加载更多回复(72)

111,120

社区成员

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

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

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