2017-11-04 2 views
-2

안녕하세요,문자열에서 중복을 제거하는 방법

문자열에서 중복 된 문자를 삭제하려고합니다. 루프가 제대로 작동하지 않습니다. 내 문자열은 "ABCBDE"이고, "ABCDE"을 인쇄하고 대신 "ABCEDD"을 인쇄합니다. 순서는 실제로 중요하지 않지만 모든 편지를 한 번만 인쇄해야합니다. 누구든지 내 코드에서 실수를 보았습니까?

#include <stdio.h> 

int main() 
{ 
    char str1[] = "ABCBDE"; 

    printf("Available: %s\n", str1); 

int len1 = strlen(str1); 

int i = 0; 
int j; 
for(i; i < len1; i++){ 
    for(j = i+1; j < len1+1; j++){ 

     if (str1[i] == str1[j]) { // remove duplicated letter 
      str1 [j] = str1 [len1 - 1]; // replace with last 
      len1 --;    // cut last 
     } 
    } 
} 

printf("Available: %s\n", str1); 

    return 0; 
} 
+0

오 @xing! 환상적입니다, 정말 고마워요! 나는 당신의 도움에 감사한다;) – Michael91

+1

@ xing lrearaor와 그것을 시험해 보았다. https://repl.it/Nkba/0 –

+2

알고리즘에 문제가 있습니다. 코드 에서뿐만 아니라 알고리즘 단계에서도 일어나는 일을 단계별로 시도해보십시오. 그런 다음 코드를 작성하십시오. – sidyll

답변

-1

후행 중복 문자 크로노 Kitsune 지적으로 손질 할 필요가 감사합니다.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str1[] = "rlrorarererr"; 

    printf("Available: %s\n", str1); 

    int len1 = strlen(str1); 

    int i = 0; 
    int j; 
    for(i = 0; i < len1; i++){ 
     for(j = i+1; j < len1; j++){ 

      //make sure j is less than len1 and remove trailing duplicate characters 
      while (j < len1 && str1[i] == str1[len1 - 1]) { 
       str1[len1 - 1] = '\0';//replace last with '\0' 
       len1--; 
      } 
      if (str1[i] == str1[j]) { // remove duplicated letter 
       str1 [j] = str1 [len1 - 1]; // replace with last 
       str1 [len1 - 1] = '\0'; // replace last with '\0' 
       len1 --;    // cut last 
      } 
     } 
    } 

    printf("Available: %s\n", str1); 

    return 0; 
} 
+0

while 루프는 하나의 테스트 케이스의 내용에서 영감을 얻은 것처럼 보이는 문제 공간의 작은 하위 집합에 대한 추악한 휴리스틱 최적화입니다. – jwdonahue

0

코드의 로직은 실제로 거의 정확합니다. 열쇠는 j이 현재 문자의 색인 일 뿐이며 j+Nj으로 복사하면 AAA과 같은 문자열이됩니다. 당신이해야 할 일은 당신의 if 조건을 반대로하고 중복되지 않는 문자를 어디에 복사 할 것인지를 추적하는 변수를 추가하는 것입니다.

for (int i = 0; i < len1; i++) { 
    // Index var used to track where to copy non-duplicate characters. 
    int di = i+1; 

    for (int j = di; j < len1+1; j++) { 
     if (str1[i] != str1[j]) { 

      /* 
      Replace this comment block with your code. 
      */ 

     } 
    } 
} 

힌트 : 여기에 당신이 시작하는 몇 가지 코드의 j에있는 문자가 i에있는 문자의 중복이없는 경우

  • , 우리는 문자를 대체 할 j에있는 문자를 복사 할 수 있습니다 di에 있습니다.
  • di 매 복사가 완료된 후에 증가합니다.
  • 2 줄의 코드.
  • 문제가있는 경우 아래 목록의 코드와 같이 작은 코드로 코드의 각 줄을 살펴보십시오. 단계별로. 필요한 경우 종이에.

    Start => End 
    A  => A 
    AA => A 
    AAA => A 
    AB => AB 
    AAB => AB 
    ABA => AB 
    ABB => AB 
    ABC => ABC 
    
+0

두 번째 for 루프에서 'j jwdonahue

+0

@jwdonahue 오류가 없습니다. 문자열의 끝에서 종료 널 바이트를 이동해야합니다. –

관련 문제