2010-10-31 146 views
0

我想編寫一個代碼,用於從字符串中刪除給定的字符。我想出了以下代碼片段。刪除字符串中的字符

現在,雖然這是我的工作,但它給我的最壞情況複雜度爲O(n^2)。任何人都可以幫助我改善這一點。

#include<iostream.h> 
#include<conio.h> 
#include<stdio.h> 

void Push(char *, int i); 

int n=6; 

int main() 
{ 
clrscr(); 
char *p = "helelo"; 
char delChar = 'e'; 

for(int i=0;i<5;i++) 
{ 
    if(*(p + i) == delChar) 
    { 
    Push(p, i); 
    } 
} 
cout<<p<<endl; 
getch(); 
return 1; 
} 

void Push(char *p, int i) 
{ 
for(int k=i;k<n;k++) 
{ 
    *(p + k) = *(p+k+1); 
} 
} 

由於

+0

你應該在列表中走一次,當你發現你W上的字符螞蟻刪除,從這一點一步一步通過列表,但像你這樣複製下一個元素到當前的元素。另外,爲什麼不使用'std :: string'/char數組,而不是執行'p [k]'而不是手動建立索引,並返回1(0表示成功)? – GManNickG 2010-10-31 04:51:18

回答

4
#include <cstring> 
#include <algorithm> 
#include <iostream> 

int main() { 
    using namespace std; 

    char s[] = "helelo"; 
    cout << s << '\n'; 

    char *end = s + strlen(s); 
    end = remove(s, end, 'e'); 
    *end = '\0'; 
    cout << s << '\n'; // hllo 

    return 0; 
} 

請注意,您不能修改字符串文字,所以我使用了一個char數組。一個std :: string會更容易。

如果你想了解的std ::刪除作品中,字符*實例(因爲它是一個模板)會,以保持它的簡單,看起來像:

char* remove(char *begin, char *end, char value) { 
    char *next = begin; 
    for (; begin != end; ++begin) { 
    if (*begin != value) { 
     *next++ = *begin; 
    } 
    } 
    return next; 
} 
+0

'std :: string'不保證以NUL結尾。所以我猜'std :: string s =「helelo」; * std :: remove(s.begin(),s.end(),'e')='\ 0''不會工作。 – 2010-10-31 04:58:32

+1

@Prasoon:實際上,0x會更改該區域中的字符串,但我不記得所有確切的細節。但是,對於std :: string,您可以使用擦除方法,就像使用s.length()而不是strlen。 :) – 2010-10-31 04:59:56

0

一個想法是構造從第一個只使用有效的字符(那些從不需要的字符不同的)一個新的字符串,然後用初始化構造的一個第一串。

0

像這樣的東西應該這樣做:

char *p = "helelo"; 
char delChar = 'e'; 
int len = strlen(p); 

for(int j=0, int i=0;i<len;i++) 
{ 
    if(*(p + i) != delChar) 
    { 
    *(p+j)=*(p+i); 
    ++j; 
    } 
} 
*(p+j)='\0'; 

cout<<p<<endl; 
getch(); 
return 1; 
0

如何:

int main() { 
    clrscr(); 
    char *p = "helelo"; 
    char delChar = 'e'; 

    int k=0; 
    for(int i=0; *(p+i); i++) { 
    if(*(p + i) != delChar) { 
     *(p + k++) = *(p + i); 
    } 
    } 
    *(p + k) = '\0'; 
    cout<<p<<endl; 
    getch(); 
    return 1; 
}