比如将字符串"fuck3ye",随机拆分开,并组成所有有可能的组合,但不能重复~ 谁可以说一下思路~?

解决方案 »

  1.   

    先固定一个顺序,得出字符串的长度为n
    通过n得出可能出现的排列组合数m然后通过random(n-1),随机得出抽取位置,从固定字符串中抽取此位置上的字符,如果此位置已经得到,重新随机获取位置,直到获取次数等于n,可以组成一个随机字符串,判断TStringLIst中是否有相同的字符串,没有将其添加到TStringList中如果TstringList的count等于m,获取完成,否则继续
      

  2.   

    m的算法
    m:=1;
    for k:=n downto 1 do
      m:=m*n
      

  3.   

    具体代码如下:好像速度有点慢var
      i,j,m,cou,n:Integer;
      s,s1,str:string;
      str1,str2:TStringList;
    begin
      s:=self.Edit1.Text;
      i:=Length(s);
      if i=0 then
        Exit;
      m:=1;
      for j:=i downto 1 do
        m:=m*j;
      cou:=0;
      str1:=TStringList.Create;
      str2:=TStringList.Create;
      str1.Clear;
      Str2.Clear;
      str:='';
      while cou<m do
      begin
        while str2.Count<i do
        begin
          Randomize;
          n:=Random(i);
          if str2.IndexOf(IntToStr(n))=-1 then
          begin
            str2.Add(IntToStr(n));
            s1:=s[n+1];
            str:=str+s1;
          end;
        end;
        str1.Add(str);
        str2.Clear;
        str:='';
        cou:=cou+1;
      end;
      self.ListBox1.Items:=str1;
    end;
      

  4.   

    const
    num=4;
    str:array[1..4] of string=('fu','c','k3y','e');//分拆很容易,假设已经拆成这样了
    var
    bstr:array[1..10] of boolean;
    resultstr:Tstringlist;{$R *.dfm}procedure zhuhe(n:integer;s:string);
    var i:integer;
    begin
      if n=0 then
      begin
        resultstr.Add(s);
        exit;
      end;
      for i:=1 to num do
        if bstr[i] then
        begin
          bstr[i]:=false;
          zhuhe(n-1,s+str[i]);
          bstr[i]:=true;    end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);begin
      resultstr:=Tstringlist.Create ;
      fillchar(bstr,sizeof(bstr),true);
      zhuhe(num,'');
      memo1.Lines.Add(resultstr.Text);
    end;
      

  5.   

    sher12的算法太精辟了~
    也感谢lovelymelon的热心回答,结贴~