top1编程
← 返回题目
题解

单词数

1 条题解

  • 0
    @ 2026-8-5 15:42:10

    解题思路

    题目让我们统计一段英文里有多少个单词。这一段英文里,单词之间用空格、逗号或者句号隔开。

    什么是单词呢?一个单词就是连续的一串字母。所以我们只要数一数,这段英文里有多少段“连续的字母”。

    我们可以用一个“开关”变量 inWord 来帮忙:

    • inWord = true 表示现在正处在一个单词里面;
    • inWord = false 表示现在在单词外面(在空格、逗号或句号上)。

    从头到尾扫描每个字符:

    1. 如果是字母(大小写都算),说明我们来到了一个单词里。如果之前不在单词里(inWord == false),说明这是一个新单词的开头,单词数加 1,并把 inWord 改成 true。
    2. 如果不是字母(是空格、逗号或句号),说明单词结束了,把 inWord 改成 false。

    这样,每个单词只有在它的开头被数到一次,正好得到单词总数。

    怎么判断字母?用两个条件组合:c>='a' && c<='z'(小写)或者 c>='A' && c<='Z'(大写)。

    拿样例 Hello everyone,welcome to code. 来说:Hello、everyone、welcome、to、code 共 5 个单词。

    参考代码

    // 用途:统计一段英文中的单词个数
    #include <iostream>
    #include <string>
    using namespace std;
    int main(){
        string s;
        getline(cin,s); // 一段英文可能很长,用getline读整行
        int cnt=0;
        bool inWord=false; // 标记当前是否处在一个单词内
        for(char c:s){
            bool isLetter = (c>='a'&&c<='z')||(c>='A'&&c<='Z');
            if(isLetter){
                // 从非字母进入字母,说明一个新单词开始了
                if(!inWord){ cnt++; inWord=true; }
            } else inWord=false; // 遇到分隔符(空格/逗号/句号)退出单词
        }
        cout<<cnt<<endl;
        return 0;
    }
    

    复杂度分析

    • 时间:把这段英文从头到尾扫描一遍,时间复杂度是 O(n),n 是英文长度(不超过 200)。
    • 空间:只用一个字符串和一个布尔变量,空间复杂度是 O(1)。
    • 1