Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How do i remove every odd time appeared character in string?

I have a string that contains only A, B, C, D. I need to remove all odd-appeared characters in this string. For example if string is "ABBBCA" it will turn into "BA" (first "A" removed because it was first time "A" appeared, then first and third "B" removed, and "C" also, because it was first time it appeared). I’m beginner in coding, so i’m sorry if this question is too simple or something.

I have tried something like this:

#include <iostream>
#include <string>

using namespace std;
int main()
{
    string firstchars = "ABBBCA";
    for (int o = 0; o < firstchars.length(); o ++) {
        firstchars.erase(o,1);
    }

But it just erases every odd element in string, not every odd "A", "B", "C" and "D".
And i have "BBA" as output.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

Make functions for each part of your code. In this case a function that determines if a value is odd.
Then a function that can keep track of the counts per character, a std::map is an ideal datastructure for that.
Then use std::remove_if (and erase idiom).

And then C++ code would look something like this:

#include <algorithm>
#include <iostream>
#include <map>
#include <string>

bool is_odd(unsigned int value)
{
    return ((value % 2) != 0);
}

// returns true if there is an odd number of counts for a character c
bool odd_count(char c)
{
    // keep the same map for each call to this function (avoid global variables!)
    static std::map<char, unsigned int> char_count;
    char_count[c]++;    // operator [] will add a new entry to the map with value 0 if it does not exist yet.
    return is_odd(char_count[c]);
}

// make copy of string on purpose (normally a string usually is passed by const &
std::string remove_odd_character_occurences_from(std::string string)
{
    auto remove_from = std::remove_if(string.begin(), string.end(), odd_count);
    // https://stackoverflow.com/questions/39019806/using-erase-remove-if-idiom
    string.erase(remove_from, string.end());

    return string;
}


int main()
{
    std::string string{"ABBBCA"};
    std::cout << remove_odd_character_occurences_from(string);

    return 0;
};
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading