Home > Net >  Fastest way to count words of string
Fastest way to count words of string

Time:05-02

How could I make this algorithm faster and shorten this code which counts word of given string?

int number_of_words(std::string &s) {
  int count = 0;
  for (int i = 0; i < s.length(); i  ) {
    // skip spaces
    while (s[i] == ' ' && i < s.length())
      i  ;
    if (i == s.length())
      break;
    // word found
    count  ;
    // inside word
    while (s[i] != ' ' && i < s.length())
      i  ;
  }
  return count;
}

CodePudding user response:

Your code is quite alright, speed-wise. But if you want to make your code shorter, you may use find_first_not_of() and find_first_of standard functions, like I did in following code that solves your task.

I made an assumption that all your words are separated by only spaces. If other separators are needed you may pass something like " \r\n\t" instead of ' ' in both lines of my code.

One small optimization that can be made in your code is when you notice that after first while-loop we're located on non-space character, so we can add i; line for free before second loop. Similarly after second while-loop we're located on space character so we may add one more i; line after second while loop. This will give a tiny bit of speed gain to avoid extra two checks inside while loop.

Try it online

#include <iostream>
#include <string>

int number_of_words(std::string const & s) {
    ptrdiff_t cnt = 0, pos = -1;
    while (true) {
        if ((pos = s.find_first_not_of(' ', pos   1)) == s.npos) break;
          cnt;
        if ((pos = s.find_first_of(' ', pos   1)) == s.npos) break;
    }
    return cnt;
}

int main() {
    std::cout << number_of_words("  abc  def ghi  ") << std::endl;
}

Output:

3
  • Related