替换字符串中的重复项

时间:2014-12-16 10:36:39

标签: 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 j=i+1;j<ch.length()&&ch[j]!='*';j++)   
      {
        if(ch[i]==ch[j])ch[j]='*';
      }
  }
    cout<<ch;
}

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的代码存在问题:

如果遇到*,您将停止外循环。现在,假设输入为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;
}