单词数

本文介绍了一种统计文章中不同单词数量的方法,并提供了两种不同时间复杂度的实现方案,帮助读者理解如何高效地完成此类任务。

单词数

Description

lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数。下面你的任务是帮助xiaoou333解决这个问题。

Input

有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由小写字母和空格组成,没有标点符号,每篇小文章最多不超过1000个字符,遇到#时表示输入结束。

Output

每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。

Sample Input

you are my friend
I am your friend too
#

Sample Output

4
5

主要就是存起来之后就是比较的问题,不一样的比较方法时间复杂度也就不一样了,所以自己可以去选择不同的比较方法。

下面我说几个比较记录的方法:

         比如说:结构体记录,数组清零,java中的数组回收,使他指向空的位置,c语言中的动态分配的free()回收啊,选择排序等等都可以。


我就来一个选择排序标记的,

先来一个时间复杂度大的代码。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int main()  
{  
    int t;
    char a[1005];  
    while(gets(a)!=NULL)
    {
    	if(a[0]=='#' && strlen(a)==1) break;
    	int t1=0,t2=0;
    	char b[500][20];
    	memset(b,0,sizeof(b));
    	for(int i=0;i<strlen(a);i++)
        {
        	if(a[i]>='a' && a[i]<='z' || a[i]>='A' && a[i]<='Z')
        	   b[t1][t2++] = a[i];
        	else
        	{
        		if(t2==0) continue;                      //防止第一个非单词破坏存储的位置。 
        		else
        		{
        			b[t1][t2]='\0';
        			t1++;
        			t2=0;
        		}
        	}
        }
        if(t2!=0){                               //t2不为零 ,说明最后的一个单词还有,还要存起来。 
        	b[t1][t2]='\0';                      //把最后记录的单词标记存起来 
        	t1++;
        }
        for(int i=0;i<t1;i++){
        	int k=i;
        	for(int j=i+1;j<t1;j++){
        		if(strcmp(b[k],b[j])==0){
        			b[k][0] = '\0';                   //出现了一个一模一样的就把一个清零。 
					k = j;
        		}
        	}
        }
        int ans=0;
        for(int i=0;i<t1;i++){
        	if(strlen(b[i])!=0)                       //比较长度就可以了, 
        	   ans++;
        }
        printf("%d\n",ans);
    }
    return 0;  
}  

再来一个时间复杂度较少的。

代码如下:
    

#include<stdio.h>
#include<string.h>

int main()
{
    char a[1000],b[200][200];
    int i,j,t,k,len,q;
    while(gets(a)!=NULL)
    {
        len=strlen(a);
        if(len==1 && a[0]=='#') break;
        j=t=0;
        for(i=0;i<len;i++)
        {
            if(a[i]!=' ')
                 b[j][t++]=a[i];
            else
            {
                b[j][t]='\0';
                if(t!=0) j++;
                t=0;
            }
        }
        b[j][t]='\0';
        t=0;
        for(i=0;i<=j;i++)
        {
            q=0;
            for(k=i+1;k<=j;k++)
               if(strcmp(b[i],b[k])==0)
                  q=1;
            if(q==0) t++;
        }
        printf("%d\n",t);
    }
    return 0;
}

<think>好的,用户想统计文本中的单词量,询问如何在程序中实现。我需要根据他们提供的引用资料,整理出具体的方法步骤。 首先,用户提到了Python和C语言的例子,可能希望得到不同语言的解决方案。但问题本身没有限定语言,所以应该先给出通用的步骤,再分别用不同语言示例说明。 引用1中的Python代码示例展示了统计文件的行、句子单词。不过用户主要关注单词量,可能需要简化代码。通常,英语文本的单词以空格或标点分隔,所以步骤可能包括读取文件、分割单词、统计量。需要注意的是,标点符号的处理可能会影响结果,比如忽略标点或者将其从单词中剔除。 引用2中的C语言代码使用结构体存储单词和计,通过检查是否存在来决定是否新增或增加计。这可能涉及更复杂的单词统计,比如统计每个单词的出现次,但用户的问题只是总,所以可以简化。 引用3提到输入英文语句统计单词量的运行流程,可能包括分割字符串、过滤空字符等步骤。这进一步确认了基本方法:分割字符串成单词组,然后计算长度。 接下来,我需要将这些步骤整理出来,分点说明。首先通用方法,然后Python示例,再C语言示例。需要注意不同语言中的实现差异,比如Python的split()方法可能更简洁,而C需要手动处理字符串。 在Python中,读取文件内容后用split()分割单词,但split()默认以空白字符分割,可能包括多个空格或换行符,需要处理。例如,用户提供的Python代码中使用len(words)来统计单词,但可能需要更严谨的处理,比如去除标点符号。 在C语言中,需要逐个字符读取,判断是否为字母,遇到非字母时结束当前单词,并计。这需要处理连续的非字母字符,比如多个空格或标点。例如,引用2中的代码可能使用状态变量来跟踪是否在单词中,遇到分隔符时增加计。 另外,用户可能希望知道如何处理边缘情况,比如连字符、缩写等。不过根据引用资料,可能不需要涉及这些复杂情况,保持基本的分割即可。 最后,确保代码示例正确,并符合用户提供的引用内容。例如,Python中的split()可能不够精确,但用户提供的例子中使用了类似的方法,所以可以沿用,同时提醒可能的改进点,如使用正则表达式处理更复杂的情况。 总结步骤: 1. 读取文本内容。 2. 分割成单词(按空格或标点)。 3. 统计有效单词量。 然后分别用Python和C语言实现,并说明注意事项,比如标点处理、大小写等。</think>在程序中统计文本单词量的通用步骤如下: ### 一、实现原理 1. **文本预处理**:将文本中的标点符号替换为空格,统一分隔符[^3] 2. **单词分割**:通过空格等分隔符将文本拆分为单词组 3. **有效计**:过滤空字符串和纯字等非单词元素 4. **统计输出**:计算组长度得到单词 ### 二、Python实现 ```python def count_words(text): # 替换标点为空格 for char in '!?.,;:"': text = text.replace(char, ' ') # 分割单词并过滤空值 words = [word for word in text.split() if word.isalpha()] return len(words) # 示例用法 text = "Hello world! This is a test." print(count_words(text)) # 输出 5 ``` ### 三、C语言实现 ```c #include <stdio.h> #include <ctype.h> int count_words(const char* text) { int count = 0; int in_word = 0; while (*text) { if (isalpha(*text)) { if (!in_word) { count++; in_word = 1; } } else { in_word = 0; } text++; } return count; } int main() { char text[] = "Hello world! This is a test."; printf("%d", count_words(text)); // 输出5 return 0; } ``` ### 四、注意事项 1. 处理连字符时需特殊判断(如"state-of-the-art"应视为一个单词) 2. 字与字母混合的字符串是否视为有效单词需根据需求决定 3. 大小写处理:建议统一转为小写后再统计[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值