如何在文本文档中找到最长的单词?

时间:2011-01-02 11:57:52

标签: c++ boost stl


我正在寻找一种方法,使用STL和boost在文本文档中找到最长的单词(基于长度)。 这是我的解决方案。然而,它根本不好,有太多的操作(令牌,排序......)。有没有更简单的方法来解决这个问题?

// utility and memory
#include <utility>
#include <functional>
#include <memory>

#include <locale>
#include <string>

// data structure and algorithm
#include <stack>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <deque>
#include <list>
#include <bitset>
#include <algorithm>
#include <iterator>
// numeric 
#include <complex>
#include <numeric>
#include <valarray>

// input/output
#include <iostream>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <streambuf>
#include <sstream>

// standard C
#include <cctype>
#include <cmath>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <cassert>
#include <cstring>

// boost
#include <boost/tokenizer.hpp>

int main() {
    std::string str = "Test, test!, test...string";
    boost::char_separator<char> sep( ",!,.-" );
    boost::tokenizer<boost::char_separator<char> > tokens( str, sep );
    std::vector<std::string> res;
    std::copy( tokens.begin(), tokens.end(), std::back_inserter( res ) );
    std::sort( res.begin(), res.end(), []( const std::string& l, const std::string& r ) { return l.length() > r.length(); } );
    std::cout << "longest : " << *res.begin() << "\n";
    return 0;
} 

最好的问候,

3 个答案:

答案 0 :(得分:3)

您可以使用std::max_element。只需给它迭代器对和你已经写过的比较器。

答案 1 :(得分:2)

这是一种方式,它有效,但它有一个问题:它运行在O(n lg n),这是排序算法的复杂性。

O(n)平凡算法将逐个扫描标记并跟踪每一步中最长的单词。在循环结束时,您将拥有该集合中最长的单词之一。我说一句,因为可能有不止一个词的长度相同。这样你就可以捕获你遇到的第一个。

您可能需要修改算法,以便跟踪每一步中看到的所有最长的单词。

答案 2 :(得分:1)

您可以找到每个令牌的长度,并将其与目前看到的max_length进行比较,而不是存储和排序整个单词令牌数组。这将减少您的空间需求,并消除排序计算的复杂性。