现在有一字符串形式如下:(ab)b(abc)(bc)c(abc)(ac)(abc)...或者更长
      一对括号代表一位,没有括号的那个数也做为一位.现在把它分解,毎一位取出一个数,如取出a b a b c a a a 做为一字符串,把毎位的数全部取完,取出生成的字符串唯一的.请问合位有什么好的方法速度上快点.
   现在想到可以这样拆分可快点:ab(abc)b(abc)(bc)c(abc)(ac)(abc)
                                  bb(abc)b(abc)(bc)c(abc)(ac)(abc)
      如此类推把下面的括号里的数分拆.
   我想还有没更快的方法?请各位高手指点;

解决方案 »

  1.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
      mStr, mStr2: String;
      mStrList: TStringList;
      i: Integer;
    begin
      mStr := '(ab)b(abc)(bc)c(abc)(ac)(abc)';
      try
        mStrList := TStringList.Create;
        SplitStr(mStr, mStrList);
        if mStrList.Count = 0 then exit;
        mStr2 := '';
        for i := 0 to mStrList.Count - 1 do
          mStr2 := mStr2 + mStrList[i];
        Memo1.Text := mStr2;
      finally
        FreeAndNil(mStrList);
      end;
    end;procedure TForm1.SplitStr(const ABeforeStr: string; var AAfterList: TStringList);
    var
      mPos, mPos1, mPos2: Integer;
      mStr, mTmStr, mStr1: String;
    begin
      mStr := ABeforeStr;
      mPos := 0;
      while (mStr <> '') do
      begin
        mPos1 := Pos('(', mStr);
        mPos2 := Pos(')', mStr);
        if (mPos1 = 0) and (mPos2 = 0) then continue
        else if (mPos1 = 0) and (mPos2 <> 0) then mPos := mPos2
        else if (mPos2 = 0) and (mPos1 <> 0) then mPos := mPos1
        else if mPos1 < mPos2 then mPos := mPos1
        else if mPos1 >= mPos2 then mPos := mPos2;
        mStr1 := Copy(mStr, 1, mPos - 1);
        if mStr1 <> '' then  AAfterList.Add(mStr1[1]);
        mTmStr := mStr;
        Delete(mTmStr, 1, Length(mStr1 + '('));
        mStr := mTmStr;
      end;
    end;
      

  2.   

    scycgjr(夏日荷):
       可能你是误解了我的意思.你只是把括号里的字符取出来了.然后和起来,并没有作我据说的分解字符. 还是很多谢你这么专心的帮我解答.
      

  3.   

    把毎位的数全部取完,取出生成的字符串唯一的:(ab)b(abc)(bc)c(abc)(ac)(abc)...
    -> 那问题是不是可以转化为 ()内 或者()外的字符串是否有重复的??不明处:
    ()内,()外一次选取多少位,0, 1,还是多位? ....还是必须要选请描述清楚