最快/最小方法检查字符串是否包含多个单词

Fastest/most minimal way to check if string contains multiple words

本文关键字:是否 包含多 单词 字符串 检查 方法 最快      更新时间:2023-10-16

我正在使用C 11,并且可以使用Regex东西。我想知道什么是最快检查字符串是否包含多个单词的方法,如果是多少个单词。在这种情况下,单词被定义为由空格隔开的字符组。

我有一些选择:

  1. file the whitespace的拆分字符串,计数拆分长度
  2. 使用某种正则
  3. 计数空格字符

选项1是最简单的方法,但是考虑到多个空格字符的核算使拆分更加复杂。2可能较慢,我不确定如何从中获得计数。3是我能想到的最快的,但是可能有很多角案件需要考虑。我希望我的解决方案尽可能高效,并尽可能少。这对我来说是一个可解决的问题,但是我需要更多关于最佳解决方案的见解。

我倾向于第一个,但是什么功能是最好的?istringstream加上迭代器stringstream,一些char*魔术?我不确定最快的方法是什么。

我会迭代字符串,计算单词并在任何连续的空间上进行迭代。

  • 每当从空格转移到非空间时增加单词计数。
  • 如果字符串以非whitespace开头

    ,请增加单词计数
    int countWords(string& toCount, const string& whitespace){
        enum countStatus {
            startOfString,
            initialWhitespace,
            movePastWord,
            movePastWhitespace
        } status=startOfString;    
        int wordCount=0;
        for(char& c : toCount) {
            bool characterIsWhitespace=false;
            if (whitespace.find(c)!=string::npos) {
                characterIsWhitespace=true;
            }
            switch(status) {
                case startOfString:
                    if (characterIsWhitespace) {
                        status=initialWhitespace;
                    } else {
                        status=movePastWord;
                        wordCount++;
                    }
                break;
                case initialWhitespace:
                    if (!characterIsWhitespace) {
                        wordCount++;
                        status=movePastWord;
                    }
                break;
                case movePastWord:
                    if (characterIsWhitespace) {
                        status=movePastWhitespace;
                    }
                break;
                case movePastWhitespace:
                    if (!characterIsWhitespace) {
                        wordCount++;
                        status=movePastWord;
                    }
            }
        }
        return wordCount;
    }
    

在这种情况下,您可以使用关联容器。C 有多种选择。例如,您可以使用std::map。在以下代码中,您可以计算文本中发生多少个多词。

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

int main()
{
    std::map<std::string,int> strCount;
    std::string str("AA BB ABC AA GE AAf FF JJ BB CC "); 
    std::string temp;
    // Split String Based on Whitespace (i.e. you need to modify it to suit the text format you have. )
    for ( int i(0); i < str.size(); ++i ){
        temp += str[i];
        if ( str[i] == ' ' ){
            temp.pop_back();
            ++strCount[temp]; // <-- if element new, insert it in map and associate new counter, otherwise increment counter of element. 
            temp.clear();
       }
    }

    std::map<std::string,int>::const_iterator iter;   
    for( iter = strCount.begin(); iter != strCount.end(); iter++ ) {
        std::cout << "#: " << iter->second << " string: " << iter->first << std::endl;
    }
    return 0;
}

前面代码的输出为

#: 2 string: AA
#: 1 string: AAf
#: 1 string: ABC
#: 2 string: BB
#: 1 string: CC
#: 1 string: FF
#: 1 string: GE
#: 1 string: JJ