如何从字符串中删除重复项

时间:2017-11-04 18:52:01

标签: c

晚上好人,

我正在尝试从字符串中删除重复的字母。我的循环无法正常工作。我的字符串是“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;
}

1 个答案:

答案 0 :(得分:0)

您的代码背后的逻辑几乎是正确的。关键是要了解j仅仅是当前字符的索引,将j+N复制到j会在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