您好,我对编码很新,我正在编写一个删除字符串上任何重复字符的代码。假设输入字符串是ABBA,那么输出应该是“空”,因为所有重复项都被删除了。另一个例子是如果输入字符串是KKCCD,则输出应为“D”,因为代码将删除K和C重复项。我的代码的问题是,当我键入KKCCD时,它返回KCD并且它不会完全删除重复项。此外,如果我要键入“AA”,结果将返回“A”而不是“Empty”。修复我的代码的任何帮助将是非常渺茫的。感谢。
#include <string.h>
using namespace std;
string deduplicate(string input){
int i;
int x;
int len= input.length();
string outputStr;
string strEmpty = "Empty";
if (input.length() == 1)
{return input;}
for(i = 0; i<len;i++){
for(x = i+1; x<len; x++){
if(input[i] == input[x]){
input.erase(x,1);
x--;}
}
len = input.length();
}
return outputStr = input;
if (input.length() == 0)
{return strEmpty;}
return outputStr = input;
}
int main()
{
string input;
cout << "Enter a string: " << endl;
cin >> input;
cout << deduplicate(input);
return 0;
}
答案 0 :(得分:0)
您正在删除找到的副本,但您永远不会删除原始字符。实现目标的最有效方法是使用STL算法。您可以查看以下链接:Remove all duplicate characters from a string (STL)
答案 1 :(得分:0)
将重复功能更改为此
string deduplicate(string input){
int i;
int x;
int len= input.length();
string outputStr;
string strEmpty = "Empty";
if (input.length() == 1)
{return input;}
for(i = 0; i<len;i++){
for(x = i+1; x<input.length(); x++){ // This line
if(input[i] == input[x]){
input.erase(x,1);
input.erase(i,1); // and this line
x--;
}
}
len = input.length();
}
return outputStr = input;
if (input.length() == 0)
{return strEmpty;}
return outputStr = input;
}
您确实删除了重复的字符,但没有删除原始字符,因此第二个擦除语句会删除它。
答案 2 :(得分:0)
一般来说,我不认为从您正在迭代的字符串中删除字符是否是个好主意。改为构建输出会更好更清洁:
#include <string>
#include <iostream>
using namespace std;
string deduplicate(string input) {
string outputStr;
if (input.length() == 1) {
return input;
}
for ( int i = 0; i < input.length(); i++ ) {
// try to find character at the rest of the string
if ( input.find( input[i], i+1 ) == string::npos ) {
// try to find character in the front
if ( ( i > 0 ) && ( input.rfind( input[i], i-1 ) == string::npos ) ) {
outputStr += input[i];
}
}
}
return outputStr;
}
int main()
{
string input;
cout << "Enter a string: " << endl;
cin >> input;
cout << deduplicate(input) << endl;
return 0;
}
答案 3 :(得分:0)
这是一个&#34;蛮力&#34;实施
string deduplicate(string str)
{
size_t l = str.length();
bool bFound = false;
char character = 0;
for (int i = 0; i < l; i++)
{
character = str[i];
while (true)
{
size_t next = str.rfind(character);
if (next != std::string::npos)
{
if (bFound || (!bFound && next != i))
{
str.erase(next, 1);
bFound = true;
l--;
}
}
if (next == i)
{
if (bFound == true)
{
i--;
}
bFound = false;
break;
}
}
}
return str;
}