Вот вроде рабочий вариант, только не забудь что число перестановок растет со скорость факторриала!!!
	Код:
	type
 TIntVec = array of Integer;
procedure AllPermutations(n: Integer; var a: TIntVec; S: String);
var
 i: Integer;
 Nums: TIntVec;
//------------------------------------
  function ExistsInNums(Num: Integer): boolean;
  var
   j: Integer;
  begin
   Result := false;
    for j := 1 to n do
     if Nums[j] = Num then
     begin
      Result:= true;
      exit;
     end;
  end;
  procedure WorkWithPerm;
  var
   i: Integer;
   Res: String;
  begin
   SetLength(Res, Length(S));
    for i := 1 to n do
      Res[i] := S[a[Nums[i]]];
   Form1.Memo1.Lines.Add(Res);
  end;
  procedure ResurseForPerm(j, i: Integer);
  var
   k: Integer;
  begin
   Nums[j] := i;
    if j = n then
     WorkWithPerm
    else
     for k := 1 to n do
      if not ExistsInNums(k) then
       ResurseForPerm(j+1, k);
   Nums[j] := 0;
  end;
// ---------------------------------------
begin
 SetLength(Nums, n+1);
  for i := 1 to n do
   ResurseForPerm(1, i);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
 n, i: Integer;
 a: TIntVec;
 S: String;
begin
 Memo1.Clear;
 S := Edit1.Text;
 n := Length(S);
 SetLength(a, n+1);
  for i := 1 to N do
   a[i]:= i;
 AllPermutations(n, a, S);
 label1.Caption := IntToStr(Memo1.Lines.Count);
end; 
 
Еще, для трех символов можно использовать:
	Код:
	var
C1, C2: Char;
i, j: Integer;
Source: String;
begin
Source := Edit1.Text;
 for i := 1 to Len do
 begin
  for j := 1 to Length(Source) do
  begin
   C1 := Source[j];
   C2 := Source[j +1];
 
   Source[j] := C2;
   Source[j + 1] := C1;
   Memo1.Lines.Add(Source);
  end;
 end;
end;
 
 
а для четырехсимвольного:
	Код:
	var
C1, C2: Char;
i, j: Integer;
Source: String;
begin
Source := Edit1.Text;
 for i := 1 to Length(Source) do
 begin
  for j := 1 to Length(Source)-1 do
  begin
   C1 := Source[j];
   C2 := Source[j +1];
 
   Source[j] := C2;
   Source[j + 1] := C1;
   Memo1.Lines.Add(Source);
  end;
 end;
  for i := 1 to Length(Source) do
  begin
   for j := Length(Source) downto 2 do
   begin
    C1 := Source[j];
    C2 := Source[j - 1];
    Source[j] := C2;
    Source[j - 1] := C1;
    Memo1.Lines.Add(Source);
   end;
  end;
end;