Home > Enterprise >  String function optimisation?
String function optimisation?

Time:12-02

I'm new to C and i just wrote a function to tell me if certain characters in a string repeat or not:

bool repeats(string s)
{
    int len = s.size(), c = 0;

    for(int i = 0; i < len; i  ){
        for(int k = 0; k < len; k  ){
            if(i != k && s[i] == s[k]){
                c  ;
            }    
        }
    }
    return c;
}

...but i can't help but think it's a bit congested for what it's supposed to do. Is there any way i could write such a function in less lines?

CodePudding user response:

Is there any way i could write such a function in less lines?

With std, you might do:

bool repeats(const std::string& s)
{
    return std::/*unordered_*/set<char>{s.begin(), s.end()}.size() != s.size();
}

CodePudding user response:

#include <algorithm>

bool repeats(std::string s){
    for (auto c : s){
         if(std::count(s.begin(), s.end(), c) - 1)
             return true;
    }
    return false;
}

CodePudding user response:

Assuming you are not looking for repeated substrings :

#include <iostream>
#include <string>
#include <set>

std::set<char> ignore_characters{ ' ', '\n' };

bool has_repeated_characters(const std::string& input)
{
    // std::set<char> is a collection of unique characters
    std::set<char> seen_characters{};

    // loop over all characters in the input string
    for (const auto& c : input)
    {
        // skip characters to ignore, like spaces
        if (ignore_characters.find(c) == ignore_characters.end())
        {
            // check if the set contains the character, in C  20 : seen_characters.contains(c)
            // and maybe you need to do something with "std::tolower()" here too
            if (seen_characters.find(c) != seen_characters.end())
            {
                return true;
            }

            // add the character to the set, we've now seen it
            seen_characters.insert(c);
        }
    }

    return false;
}

void show_has_repeated_characters(const std::string& input)
{
    std::cout << "'" << input << "' ";

    if (has_repeated_characters(input))
    {
        std::cout << "has repeated characters\n";
    }
    else
    {
        std::cout << "doesn't have repeated characters\n";
    }
}

int main()
{
    show_has_repeated_characters("Hello world");
    show_has_repeated_characters("The fast boy"); 
    return 0;
}

CodePudding user response:

This is your new compact function :

#include <iostream>
#include <algorithm>

using namespace std;

int occurrences(string s, char c) {
    return count(s.begin(), s.end(), c); }

int main() {
    //occurrences count how many times char is repetated. 
    //any number other than 0 is considered true.
    
    occurrences("Hello World!",'x')?cout<<"repeats!":cout<<"no repeats!";
    
    //It is equal write
    //
    //  if(occurrences("Hello World!",'x'))
    //      cout<<"repeats!";
    //  else 
    //      cout<<"no repeats!";
    //So to count the occurrences
    //
    //  int count = occurrences("Hello World!",'x'); 
}
  •  Tags:  
  • c
  • Related