求字符串中所有字符的可能组合?(大家看一下,在线等,13:00以前结贴) (100分)

  • 主题发起人 主题发起人 devid_zhang
  • 开始时间 开始时间
D

devid_zhang

Unregistered / Unconfirmed
GUEST, unregistred user!
求字符串中所有字符的组合(注意:是组合不是排列,如:ab和ba是相同的组合)
再举例:字符串“abc”的所有字符可能的组合为:a, b, c, ab, ac, bc, abc, 求其算法。(C++或java语言均可)
 
求{a,b,c}的幂集
 
楼上的:
能不能写一下, 幂集如何实现之
 
排列组合!!
多重循环
 
那么abc和bac、acb等等页都是同一个组合了?
那么这样做的话第一步工作应该是提取出字符串中的字符,当然提取出来的不应该有重复了,然后在进行组合……
 
请大家写出代码,我尝试了多次,没有成功,我现在需要一个可用的程序
 
不是吧,应该不难啊,我试试看
 
有点难度,gkrong关注此问题。
 
以前有人问过同样的问题,帮你找找看!
 
写了个算法,很差,下贴贴出,大家可以优化一下,我先添点注释
 
一个简单的算法问题,求一个已知字符串的所有子集
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1598615
 
来自:guchenyi, 时间:2003-1-29 10:11:00, ID:1603498
好了,搞定:)。肯定满足要求,只要顺序不同不视做不同就可以
procedure GetSet(Source:string);
var
iListCount,itemp:integer;
iLen,iNum:integer;
stemp,sleft:string;
begin
Mylist.Clear;
iLen:=length(source);
sLeft:=Source;
iNum:=1;
while (iNum<=iLen)do
begin
stemp:=Copy(sleft,1,1);
sLeft:=copy(sleft,2,iLen-1);
itemp:=MyList.Count-1;
Mylist.Add(stemp);
for iListCount:=0 to itempdo
begin
Mylist.Add(Mylist.strings[iListCount]+stemp);
end;
iNum:=iNum+1;
end;
end;

 
这个方法也行
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ClipBrd;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
function GetAllSubSet(S: String;
StrLst: TStrings): Integer;
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ts: TStrings;
ct: Integer;
begin
ts := TStringList.Create;
ct := GetAllSubSet(Edit1.Text, ts);
ts.Insert(0, 'Count: ' + IntToStr(ct));
ts.Insert(0, '');
Clipboard.AsText := ts.Text;
ShowMessage(ts.Text);
ts.Free;
end;

function TForm1.GetAllSubSet(S: String;
StrLst: TStrings): Integer;
var
m: array[1..500] of Integer;
ts: String;
ns: String;
i, len: Integer;
begin
Result := 0;
if Length(S) = 0 then
Exit;
//此处应检测字符串中的重复字符并进行删除
//可以采用集合进行运算
ts := S;
len := Length(ts);
ns := StringOfChar(#0, 500);
i := 1;
m := 1;
while (i > 1) or (m <= len)do
begin
ns := ts[m];
ns[i+1] := #0;
StrLst.Add(PChar(ns));
if m < len then
begin
i := i + 1;
m := m[i-1]+1;
end
else
begin
i := i - 1;
m := m + 1;
end;
end;
Result := StrLst.Count;
end;

end.
 
上面的方法使用了入栈的技术,
用循环模拟递归
 
//晕,已经有人贴了啊:(
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ts,temps,t: Tstrings;
implementation
{$R *.dfm}
{ Description:去除字符串中重复的字符,区分大小写}
Function GetS(s:string):string;
var rs:string;
i:integer;
begin
rs := s[1];
for i := 2 to Length(s)do
if Pos(s,rs)=0 then
rs := rs+s;
Result := rs;
end;

{ Description:对s进行优化,使得其不参与下次排列的字符为' ' }
{ 其实最好是应该成'000000111'这样的格式, }
{ 表示只有后3位参与之前已经排好的6位字符串的排列 }
Functiondo
Ss(subs:string;s:string):string;
var rs:string;
i :integer;
begin
rs := s;
{//用这个方法的话排列中'ab'与'ba'是并存的
for i := 1 to Length(subs)do
begin
rs[Pos(subs,s)] := ' ';
end;
}
for i := 1 to Pos(subs[Length(subs)],s)do
begin
rs := ' ';
end;
// rs :=
result := rS;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: String;
temp:string;
s2:string;
c: Integer;
j: Integer;
begin
s := GetS(edit1.Text);
temps.Clear;
//临时组合,分别用来记录只有1个2个3个……的字符组合
ts.Clear;
//结果集,排序后的所以组合
t.Clear;
//temps的下级排序组合,如temps为2个字符的所有组合时t结果为所有3个字符的组合
for c := 1 to Length(s)do
t.Add(s[c]);
//初试时t为所以1个字符的组合
ts.AddStrings(t);
while (true)do
//可能只通过下面的for循环也可以实现
begin
temps.Clear;
temps.AddStrings(t);
t.Clear;
for c := 0 to temps.Count-1do
begin
temp := temps.Strings[c];
s2 :=do
Ss(temp,s);
for j := 1 to Length(s)do
begin
if s2[j] <> ' ' then
begin
t.Add(temp+s2[j]);
end;
end;
end;
ts.AddStrings(t);
if Length(t.Strings[0])=Length(s) then
break;
end;
memo1.Clear;
memo1.Lines := ts;
Caption := '共有组合 '+IntToStr(ts.Count)+ '个';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ts := TStringlist.Create;
temps := TStringList.Create;
t := TStringlist.Create;
end;

end.
 
不管怎么写,似乎都不容易看懂啊
 
先谢了各位,我调试通过后,结贴!
 
不是吧:(
我解释一下我的方法
这种排列应该是如下的形式的:
a b c d//表示的是单个的
ab ac ad bc bd cd//其实就是上一行的所有元素分别再添加一个新的字符嘛
abc abd acd bcd //这里也是上一行的所有元素新增加一个字符
abcd //当然要去除重复的
这就是我的方法,用了个temps和t分别记录着每行的信息,同时不断的把每行的信息添到结果ts中去
 
有用C++或java语言写的吗?
 
结果怎么存放,放在数组还是链表里面啊?
我的那个算法简单,比较容易改成c/c++的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
724
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部