从字符串中删除重复的字符,而无需使用其他缓冲区

时间:2018-11-02 02:31:34

标签: java string

我正在处理一个采访问题,我需要在不使用附加缓冲区的情况下从字符串中删除重复的字符。

下面是我的代码,但没有为该字符串"aabbab"提供正确的输出。下面的代码有什么问题吗?

  private static void removeDuplicates(char[] str) {
    if (str == null)
      return;
    int len = str.length;
    if (len < 2)
      return;

    int tail = 1;
    for (int i = 1; i < len; ++i) {
      int j;
      for (j = 0; j < tail; ++j) {
        if (str[i] == str[j])
          break;
      }
      if (j == tail) {
        str[tail] = str[i];
        ++tail;
      }
    }
    str[tail] = 0;
  }

调试后,我无法找出上面代码中的错误。

3 个答案:

答案 0 :(得分:0)

它需要这样做

if (str == null)
        return;
int len = str.length;
if (len < 2)
    return;
for(int i = 0; i <len; i++) {
    for(int j = i+1; j<len; j++) {
        if(str[i] == str[j]) {
            str[j] = 0;
        }
    }
}

但是结果看起来像这样a[space]b[space][space][space],因为我们只是将字符设置为0。

答案 1 :(得分:0)

这个问题的时间复杂度是O(n ^ 2)。

但是,如果您输入的char数组有一些限制,例如char数组在'a'和'z'之间。它具有O(n)方法来解决。

这样的想法是使用一个变量的位保存字符。

void removeDuplicate(char s[])
{
    int len = strlen(s);
    if(len < 2) return;
    int check = 0, p = 0;
    for(int i=0; i < len; ++i)
    {
        int v = (int)(s[i]-'a');
        if((check & (1 << v))==0)
        {
            s[p++] = s[i];
            check |= (1 << v);
        }
    }
    s[p] = '\0';
}

ps。该代码来自其他网站。

答案 2 :(得分:0)

因此,基本上,我们将首先使用一些特殊字符标记重复项,然后再删除这些特殊字符。时间复杂度为O(n ^ 2)。

char[] str = "aabbabcdcd".toCharArray();
        int len = str.length;
        if (len < 2)
          return;

步骤1,用一些特殊字符标记位置,例如0$

for (int i = 0; i < len-1; ++i) {
            for(int j=i+1;j<len;j++)
            {
                if(str[i]==str[j])
                {
                    str[j]=0; //<---mark the positions      
                }
            }
        }
  

输出:a b cd

步骤2,我们需要删除内部黑色空间

int j;


for(int i=1;i<len-1;i++)
{
  if(str[i]==0)
  {
      for(j=i+1;j<len;j++)
      {
          if(str[j]!=0)
          {
              break;  
          }
      }
      if(j!=len)  //<-----replace with blank
      {
        str[i] = str[j];  
        str[j]=0;  
      }

  }


}
  

输出:abcd