从字符串

时间:2017-09-29 03:29:13

标签: c++ string char duplicates

您好,我对编码很新,我正在编写一个删除字符串上任何重复字符的代码。假设输入字符串是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;
}

4 个答案:

答案 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;
}