替换字符串中的重复项

Replacing duplicates in a string

本文关键字:字符串 替换      更新时间:2023-10-16

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

#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;
}

上面的代码为某些输入提供了意外的结果。例如,如果输入是"adad",我得到的答案是"ad*d",而"adda"和"aadd"的输出与预期的输出相匹配。谁能告诉我我做错了什么?

就像 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;
}

提示: 一旦循环条件返回 false,您的 for 循环就会中断。 adad 在外部 for 循环的第一次迭代后更改为 ad*d。但随后i被设置为 1j设置为 2 。您的第二个 for 循环会使用这些值执行吗?

你的代码问题是:

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

#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;
}