2016-02-02 84 views
1

我需要從字符串中刪除重複的空格。 下面的代碼從互聯網上抓取,除了重複字符串的第一個字符之外,工作得很好。 也可能有更快的事情。如何從字符串中刪除重複的空格

function DeleteRepeatedSpaces(OldText: string): string; 
var 
    i: integer; 
    s: string; 
begin 
    if length(OldText) > 0 then 
    s := OldText[1] 
    else 
    s := ''; 

    for i := 1 to length(OldText) do 
    begin 
    if OldText[i] = ' ' then 
    begin 
     if not (OldText[i - 1] = ' ') then 
     s := s + ' '; 
    end 
    else 
    begin 
     s := s + OldText[i]; 
    end; 
    end; 

    DelDoubleSpaces := s; 
end; 

回答

5

基於最簡單狀態機(DFA)的函數。最小內存重新分配。
State是連續空格的數量。
J是刪除空格的數量。

function DeleteRepeatedSpaces(const s: string): string; 
    var 
    i, j, State: Integer; 
    begin 
    SetLength(Result, Length(s)); 
    j := 0; 
    State := 0; 

    for i := 1 to Length(s) do begin 

     if s[i] = ' ' then 
     Inc(State) 
     else 
     State := 0; 

     if State < 2 then 
     Result[i - j] := s[i] 
     else 
     Inc(j); 

    end; 

    if j > 0 then 
     SetLength(Result, Length(s) - j); 
    end; 
-1

您可以使用這樣的事情:

function DeleteRepeatedSpaces(const s: string):string; 
var 
    i:integer; 
begin 
    Result := ''; 
    for i := 1 to Length(S) do begin 
    if not ((s[i]=' ') and (s[i-1]=' ')) then begin 
     Result := Result + s[i]; 
    end; 
    end; 
end; 

刪除兩點多個空格的字符串是連續的。

此字符串(無空格):

The string have groups of spaces inside 

回報這樣的:

The string have groups of spaces inside 

此字符串(與內部空間組):

The string have  groups of spaces inside 

返回此:

The string have groups of spaces inside 
+1

如果's'以空格開始?是[i-1]'有效嗎? –

+0

是的。 for..begin從索引1開始。 這個特殊情況經過測試。 –

+0

爲什麼downvote?我不明白。代碼工作正常。我違反了規則嗎? –

2

下面是沒有很大的效率,但可能更使通過文字processiing串字符,因爲它不需要在輸出的每個字符的新字符串分配:

function RemoveDupSpaces(const Input : String) : String; 
var 
    P : Integer; 
begin 
    Result := Input; 
    repeat 
    P := Pos(' ', Result); // that's two spaces 
    if P > 0 then 
     Delete(Result, P + 1, 1); 
    until P = 0; 
end; 
3

迭代所有成員字符串,將字符移動到結果,但跳過重複的空格。

function DeleteRepeatedSpaces(const OldText: string): string; 
var 
    i,j,hi: Integer; 
begin 
    SetLength(Result,Length(OldText)); 
    i := Low(OldText); 
    j := i; 
    hi := High(OldText); 
    while (i <= hi) do begin 
    Result[j] := OldText[i]; 
    Inc(j); 
    if (OldText[i] = ' ') then begin 
     repeat //Skip additional spaces 
     Inc(i); 
     until (i > hi) or (OldText[i] <> ' '); 
    end 
    else 
     Inc(i); 
    end; 
    SetLength(Result,j-Low(Result)); // Set correct length 
end; 

上面的代碼是相當快的(比任何其他貢獻更快,到目前爲止)。

下面是一個更優化的程序:

function DeleteRepeatedSpaces(const OldText: string): string; 
var 
    pO,pR: PChar; 
begin 
    SetLength(Result,Length(OldText)); 
    pR := Pointer(Result); 
    pO := Pointer(OldText); 
    while (pO^ <> '') do begin 
    pR^ := pO^; 
    Inc(pR); 
    if (pO^ <> ' ') then begin 
     Inc(pO); 
     Continue; 
    end; 
    repeat // Skip additional spaces 
     Inc(pO); 
    until (pO^ = '') or (pO^ <> ' '); 
    end; 
    SetLength(Result,pR-Pointer(Result)); 
end; 
+1

我想它不能比你的「更優化的例程」更快。讚賞。 –

相關問題