c++ - 理解删除字符串中重复字符的代码(来自破解编码面试)

标签 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 的末尾。你们能帮我解释一下吗?

最佳答案

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

关于c++ - 理解删除字符串中重复字符的代码(来自破解编码面试),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596220/

相关文章:

string - 查找没有特定子字符串的字符串数

java - 从字符串数组中获取包含指定字符的字符串列表

java - 在线性 (O(N)) 时间内对数组进行排序

C++ 扩展 Windows WRL 组件类不起作用

c++ - std::vector 比 std::map 更快的键查找?

c++ - 如何使用 C++ 检查进程是否正在运行

python - 替换Python中的单词?

php - 在考虑 "full stops"的情况下截断 html 文本(在 CachePHP TextHelper->truncate 中)

c++ - g++ 编译数组,其大小在运行时由 const 值(不是 constexpr)给出

python - 最长的元音子串 - Python