从字符串中删除重复的字符

Deleting Duplicate chars from a string

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

你好,我是编码的新手,我正在编写一个代码,该代码删除字符串上的任何重复字符。假设输入字符串是ABBA,然后输出应为"空"。由于所有重复项都被删除了。另一个示例是,如果输入字符串是kkccd,则输出应为" d&quot"。由于代码将删除K和C的重复项。我的代码的问题是,当我键入KKCCD时,它会返回KCD,并且并未完全删除重复项。另外,如果我要键入" AA"结果又回来了。而不是"空"。修复我的代码的任何帮助都将被大大关注。谢谢。

包括

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

将重复功能更改为此

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

您确实删除了重复的字符,但不是原始的,因此第二个擦除语句是这样做的。

您正在删除找到的副本,但您永远不会删除原始字符。实现目标的最有效方法是使用STL算法。您可能需要检查以下链接:从字符串(STL)

中删除所有重复字符

一般来说,我认为这不是从迭代的字符串中删除字符的好主意。构建输出会更好,更干净:

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

这是"蛮力"实现。

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