一个单词,可以在其相边的两个字母中插入一个“-”(横杠字符)而形成一个字符串,比如单词cake,可以在相连字母间(不同的位置)拖入“-”,而得到如下字符串: 
c-a-k-e 
ca-k-e 
cak-e 
c-ak-e 
c-ake 
ca-ke 
c-a-ke 如果给定任一个单词(作为输入),按上面的规则,在其相边的两个字母中插入一个“-”,要计算出所有可能的形成的字符串(输出),程序要怎么写? 又例如输入单词 cat,输出结果为: 
c-a-t 
ca-t 
c-at 最后,碰到这样的问题我总没有思路,由于本人大学学的是通信及电子工程专业,不知道要提高类似问题的解决能力,需要补补计算机专业的哪门课程的知识?

解决方案 »

  1.   

    取 组合 的所有结果
    2^n种
    for i:=0 to 2^n-1 do
      扫描i的2二进制位,是0则不加'-',是1则在该位置插入'-',输出该字符串
      

  2.   

    I是可插入-的个数:
    c-a-k-e
    i=3
      

  3.   

    我觉得你可以更加抽象一点:
    一个单词假如有n个字母,那么可最多插入的个数为n-1,最少为0
    假如单词:cake
    cake
    c-ake
    ca-ke
    cak-e
    ...
    插0个-,插1个-...
    走两个循环应该可以写出来...
      

  4.   

    可是插两个时,循环就不好写了:
    c-a-ke
    c-ak-e
    ca-k-e
    这个是怎么循环出来?特别如果单词很长,如finish:
    f-n-ish
    f-ni-sh
    f-nis-h
    fn-i-sh
    ……
      

  5.   

    写了下应该没有问题了哈,也欢迎各位高手来评论一下,水平菜就不要笑话偶了哈:
    两个相关函数:
    function TMainFM.getPower(Base, Mi: Integer): Integer;
    var
      i:integer;
    begin
      Result:=1;
      for i:=1 to Mi do
        Result:=Result*Base;
    end;function TMainFM.Int64ToBinStr(Source: Int64):string;
    begin
      while Source > 0 do
      begin
        if  (Source and $01)=1 then Result :='1'+Result else Result :='0'+ Result;
          Source:=Source SHR 1;
      end;
    end;[code]
    Memo1为TMemo控件
    [code=Delphi(Pascal)]procedure TMainFM.Button2Click(Sender: TObject);
    var
      n,i,j:integer;
      sWord,sNewWord,sTemp:string;
    begin
      Memo1.Lines.Clear;
      sWord:='cake';
      n:=Length(sWord);
      for i:=0 to getPower(2,n-1)-1 do
      begin
        sNewWord:=sWord;
        sTemp:='';
        sTemp:=Int64ToBinStr(i);
        while Length(sTemp)<n do
          sTemp:='0'+sTemp;
        for j:=length(sTemp) downto 1 do
          if sTemp[j]='1' then
            Insert('-',sNewWord,j);
        Memo1.Lines.Add(sNewWord);
      end;
    end;
      

  6.   

    function TMainFM.getPower(Base, Mi: Integer): Integer;
    var
      i:integer;
    begin
      Result:=1;
      for i:=1 to Mi do
        Result:=Result*Base;
    end;function TMainFM.Int64ToBinStr(Source: Int64):string;
    begin
      while Source > 0 do
      begin
        if  (Source and $01)=1 then Result :='1'+Result else Result :='0'+ Result;
          Source:=Source SHR 1;
      end;
    end;
    procedure TMainFM.Button2Click(Sender: TObject);
    var
      n,i,j:integer;
      sWord,sNewWord,sTemp:string;
    begin
      Memo1.Lines.Clear;
      sWord:='cake';
      n:=Length(sWord);
      for i:=0 to getPower(2,n-1)-1 do
      begin
        sNewWord:=sWord;
        sTemp:='';
        sTemp:=Int64ToBinStr(i);
        while Length(sTemp)<n do
          sTemp:='0'+sTemp;
        for j:=length(sTemp) downto 1 do
          if sTemp[j]='1' then
            Insert('-',sNewWord,j);
        Memo1.Lines.Add(sNewWord);
      end;
    end;
    其中Memo1为TMemo控件,效率可能不怎么高,但能解决问题就OK了。
      

  7.   

    Mathsfan谢谢,这个贴子少了点,另外那个贴子给您分了