替换字符串中的重复项
Replacing duplicates in a string
我正在尝试编写一个代码,用"*"替换字符串中的重复项。我写的代码是——
#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
被设置为 1
,j
设置为 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;
}
相关文章:
- 如何使用regex_replace将子字符串替换为字符串中的另一个子字符串,同时保持整个文本完整?
- 使用C++将一个字符串替换为另一个字符串
- 简单的字符串替换给出错误,尽管参数正确
- UnicodeString 将一个子字符串替换为另一个子字符串
- C++字符串.替换生成"No matching function for call"错误
- std::字符串替换不保留结尾?
- GCC Bug,使用尖括号通过宏包含标头时"linux"路径中的字符串"<>"替换为 "1"
- 字符串替换问题
- 将带双引号的字符串替换为带双引号的字符串
- 如何在C++中将字符串替换为"Match case"和"Match whole word"
- 字符串替换和奇怪的字符
- C++中的字符串反转不将旧字符串替换为新字符串
- 用c++字符串替换snprintf
- 字符串::替换在有效的迭代器上抛出 std::out_of_range
- 简单的标准::字符串替换在C++
- C++字符串替换函数无限循环
- 分析字符串替换内存泄漏
- C++:-用另一个字符串替换一段字符串
- 提升字符串替换不会用字符串替换换行符
- C++中任意长度字符串的字符串替换