理解删除字符串中重复字符的代码(从破解编码访谈)

时间:2012-07-21 22:10:34

标签: c++ string algorithm

以下是“破解编码访谈”的问题Q1.3“设计算法并编写代码以删除字符串中的重复字符而不使用任何额外的缓冲区。注意:一个或两个额外的变量都没问题。数组的副本不是。“我写了一个似乎运作良好的程序,但我对自己的程序感到困惑。这是附带的代码。

string remove_duplicates(string &s1)
{
   int n=s1.size();
   for(int i=n-1; i!=-1; --i)
        for(int j=0; j<i; ++j)
        {
            if(s1[i]==s1[j])
            {
                int k=i;
                while(k!=n)
                {
                    s1[k]=s1[k+1];
                    k++;
                }
            }
        }
    return s1;
}

如果s1 = abcdeafg,则使用此代码输出abcdefg(如果输入为abababab,则输出为ab) 但我认为是因为s1的长度没有变化,输出应该是abcdefga,因为我只是将第二个'a'移动到s1的末尾。你能帮我解释一下吗?

1 个答案:

答案 0 :(得分:2)

s1的长度实际上在变化。当你找到一个重复的字符并使用while(k!= n)循环将重复字符移向s1的末尾时,在循环的最后一次迭代中,当k == n-1时,代码正在评估s1 [ n-1] = s1 [n]实际上是s1 [n-1] ='\ 0',所以s1的长度缩短为1.