2012-05-17 2 views
2

Я хочу вставить символ в каждое возможное положение строки s, кроме начала и конца. , например.Как вставить символ во все возможные позиции строки?

abc 
I want to have 
a-bc 
ab-c 
a-b-c 

Ниже мой тест, но не правильно:

procedure TForm1.Button2Click(Sender: TObject); 
var 
start, i,j,k,position,loop: integer; 
laststart,lastend:integer; 
c,item,stem:string; 
str, prefix:string; 
begin 
str:='abcd'; 
memo1.clear; 
memo1.Lines.Add(str); 
laststart:=0; 
lastend:=memo1.lines.count-1; 
position:=0; 
prefix:=''; 
loop:=0; 
while loop<=length(str)-1 do 
    begin 

    for j:= laststart to lastend do 
    begin 
    item:=memo1.lines[j]; 
     for k:=length(item) downto 1 do 
     begin 
      if item[k]='-' then 
      begin 
      position:=j; 
      break; 
      end; 
     end; //for k 
    prefix:=copy(item,1,position); 
    stem:=copy(item,position+1, length(item)); 

     for start:=1 to length(stem)-1 do 
     begin 
     c:=prefix+copy(stem,1,start)+'-'+ 
     copy(stem, start+1,length(stem)); 
     memo1.lines.add(c); 
     end; 
    end; //for j 
    laststart:=lastend+1; 
    lastend:=memo1.Lines.Count-1; 
inc(loop); 
end; //end while 

end; 

выводит:

abcd 
a-bcd 
ab-cd 
abc-d 
a--bcd // not correct 
a-b-cd 
a-bc-d 
ab--cd //incorrect 
ab-c-d 
abc--d //incorrect 
a--bc-d //incorrect 

Я чувствую максимально возможные перерывы в Lenth (ул) -1, abc-> наиболее вероятна вставка 2 '-' (дважды). Это верно?

И есть ли другие более быстрые способы сделать это?

Большое спасибо.

+1

Для достижения этой цели, я буду играть с двоичными числами ... Я бы увеличить его ... если 0 без разделителя, если 1, добавьте разделитель ... – Whiler

+1

@Whiler: Это именно то, что я сделал ниже. –

ответ

7

Это работает:

procedure TForm4.Button1Click(Sender: TObject); 
var 
    S: string; 
    N: integer; 
    Marker: cardinal; 
    MaxMarker: cardinal; 
    Str: string; 
    i: Integer; 
begin 
    S := Edit1.Text; 
    N := length(S); 
    Marker := 0; 
    MaxMarker := 1 shl (N - 1) - 1; 

    Memo1.Clear; 
    Memo1.Lines.BeginUpdate; 

    for Marker := 0 to MaxMarker do 
    begin 
    Str := S[1]; 
    for i := 2 to N do 
    begin 
     if (Marker shr (N-i)) and 1 <> 0 then 
     Str := Str + '-'; 
     Str := Str + S[i]; 
    end; 
    Memo1.Lines.Add(Str); 
    end; 

    Memo1.Lines.EndUpdate; 
end; 

Screenshot http://privat.rejbrand.se/markersinstrallpos.png

Как вы можете видеть, это работает, используя бинарное представление чисел:

t e s t 
0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 
+0

@Warren: 'для маркера: = 1 до MaxMarker do', чтобы пропустить ваш * вход * ... – Whiler

+0

@AndreasRejbr Wonderful Большое спасибо – Warren

+0

@Whiler Большое спасибо. – Warren

9

рекурсивной версии.

procedure InsertSymbols(s: string; c: Char; Position: Integer = 1); 
    var 
    i: Integer; 
    begin 
    Memo1.Lines.Add(s); 
    for i := Position to Length(s) - 1 do 
     InsertSymbols(Copy(s, 1, i) + c + Copy(s, i + 1, Length(s) - i), c, i + 2); 
    end; 

begin 
    InsertSymbols('Test', '-'); 
end; 
+0

+1 для изобретательности. Кроме того, это решение позволяет использовать гораздо более длинные строки, чем мое решение (хотя мое решение легко может быть слегка изменено, чтобы допускать сколь угодно длинные строки). –

+1

Строка с 32 символами выводит около 100 ГБ, поэтому применение любого метода до более длинных строк является более теоретическим ... – MBo

+2

Вы правы. Кстати, интересно, какое приложение имеет в виду. –

1

Почему все сложные решения? Просто скопируйте строку в новый символ char, добавьте дефис между ними, за исключением последнего.

+1

Этот ответ был бы более впечатляющим, если бы какой-то код выполнял именно это. – NGLN

+0

Не для чего-то такого же тривиального, как это –

1

мне нужно отделить строку для использования в качестве серийного номера и вот код:

Function GetDashedKey(Key: string): string 
const 
    PartSize = 7; 
var 
    Indx: Integer; 
    dashedKey : string; 
begin 

    repeat 
    if Trim(dashedKey)<>'' then 
     dashedKey := dashedKey + ' - '; 

    if Length(Key) < PartSize then 
    begin 
     dashedKey := dashedKey + Key; 
     Key := ''; 
    end 
    else 
    begin 
     dashedKey := dashedKey + Copy(Key, 1, PartSize); 
     Key := Copy(Key, PartSize + 1, Length(Key)-1); 
    end; 
    until Trim(Key) = ''; 

    Result := dashedKey; 
end; 
Смежные вопросы