2010-10-31 148 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; 
}