C++ 替换字符串中的重复项

C++ 替换字符串中的重复项,c++,replace,C++,Replace,我正在尝试编写一个代码,用“*”替换字符串中的重复项。我写的代码是—— #include<iostream> #include<math.h> #include<string> using namespace std; int main() { string ch; cin>>ch; for(int i=0;i<ch.length()&& (ch[i]!='*');i++) { for(int

我正在尝试编写一个代码,用“*”替换字符串中的重复项。我写的代码是——

#include<iostream>
#include<math.h>
#include<string>
using namespace std;


int main()
{
  string ch;
  cin>>ch;
  for(int i=0;i<ch.length()&& (ch[i]!='*');i++)
  {
      for(int j=i+1;j<ch.length()&&ch[j]!='*';j++)   
      {
        if(ch[i]==ch[j])ch[j]='*';
      }
  }
    cout<<ch;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
弦ch;
cin>>ch;

对于(int i=0;i,如Piotr S.在评论中所说,您需要继续处理字符串,即使当前字符是
*
。以下是我的观点,这应该可以:

#include<iostream>
#include<math.h>
#include<string>
using namespace std;


int main()
{
    string ch;
    cin >> ch;
    for(int i = 0; i < ch.length(); ++i)
    {
        if(ch[i] == '*') continue; // skip this entry
        for(int j = i + 1; j < ch.length(); ++j)   
        {
            if(ch[i] == ch[j]) ch[j]='*';
        }
    }
    cout<<ch;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
弦ch;
cin>>ch;
对于(int i=0;icout提示:当循环条件返回false时,for循环将立即中断。在外部for循环的第一次迭代后,adad将更改为ad*d。但是,
i
设置为
1
j
设置为
2
。第二个for循环是否会使用这些值执行?

问题您的代码是:

如果遇到
*
,您将停止外循环。现在,假设输入为
abcabc
。在外循环的第一次迭代中,您将其更改为
abc*bc
。在外循环的第二次迭代中,内循环将遇到
*
,并将退出(不将
b
更改为
*
)。外循环的第三次迭代也会发生同样的情况。在外循环的第四次迭代中,退出条件(
ch[i]!=“*”
)将变为false,并且您的程序将退出。下面是一个修复程序:

#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int main()
{
    string ch;
    cin >> ch;
    for(int i=0; i < ch.length(); i++)
    {
        for(int j = i + 1; j < ch.length(); j++)     
        {
            if(ch[i] == ch[j] && ch[i] != '*')
                ch[j]='*';
        }
    }
    cout << ch << endl;
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
弦ch;
cin>>ch;
对于(int i=0;i因为你的循环在第一次遇到
*
时就停止了,它应该是那些循环中的
if
条件,而不是循环中断条件,这是学习编程的完美任务,所以如果我帮助你,我会感到非常内疚如果你使用
getline
作为输入,那么你也可以得到一个带空格的字符串K,考虑如何减少从二次到线性的复杂性(以及时间)。@ Piotrs。我试过了你的建议,代码现在看起来很好:)上面的算法是否可以删除重复,而不是用替换的字符替换它们,通过一些微小的改变?是的,你可以使用STD::String::EraseE.(),但是,在本例中,创建新的
字符串输出
,并附加每个不重复的字符可能是最简单的。更改要迭代的项目即使不危险,也总是很棘手的,所以最简单的方法是执行以下操作: