2013-11-18 3 views
-3

Как удалить все соседние дубликаты в виде строки в C. сказать example..if «caaabbcdd» является данная строка, то он должен удалить последовательно, какУдалить соседние дубликаты в строке в C

1. cbbcdd 

2. ccdd 

3. dd 

, таким образом, пустая строка возвращается в конце. Сложность времени может быть O (n^2) для начала. Может кто-нибудь помочь.

до сих пор это я то, что я сделал

void recursiven2(char *str) 
{ 
int i,j,k,len; 
    len=strlen(str); 
    for(i=0;i<len-1;i++) 
    { 
    if(str[i]==str[i+1]) 
    { 
     for(j=i;j<len-2;j++) 
      str[j]=str[j+2]; 
     str[j]='\0'; 
    } 
    } 

} 
+3

Что вам удалось достичь, до сих пор? Отправьте свой код. – unwind

+0

void find (char * str) { \t int i, j, k, len; \t \t len = strlen (str); \t \t для (я = 0; I

+0

И это работает/не работает? Где вы застряли? – HAL

ответ

0

Ваш код близок, но не совсем.

Проще об этом думать в терминах «если этот персонаж такой же, как и предыдущий, отбросьте его». Ваш код больше похож на «если этот символ совпадает с следующим», если вы видите разницу.

Также, memmove() просто обожает это.

Может быть что-то вроде:

void compress(char *str) 
{ 
    size_t len = strlen(str); 

    if(len <= 1) 
    return; 

    for(size_t i = 1; i < len;) 
    { 
    if(str[i] == str[i - 1]) 
    { 
     memmove(&str[i], &str[i + 1], (len - (i + 1) + 1); 
     --len; 
    } 
    else 
     ++i; 
    } 
} 

Там может быть obi-wan error (! Или два) в выше, я не проверял.

+0

ваш код не производит правильный вывод ... для строки «ccaaabbdd» возвращающая строка должна быть пустой ... но в вашем случае это «cabd». –

+0

Любая другая логика для решения? –

1

Вы можете обратиться к this. У этого есть очень хорошее объяснение.

Смежные вопросы