统计单词数#洛谷

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例 1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例 2)。

输入格式

222 行。

111 行为一个字符串,其中只含字母,表示给定单词;

222 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 000 开始);如果单词在文章中没有出现,则直接输出一个整数 −1-11

注意:空格占一个字母位

样例 #1

样例输入 #1

To
to be or not to be is a question

样例输出 #1

2 0

样例 #2

样例输入 #2

to
Did the Ottoman Empire lose its power at that time

样例输出 #2

-1

提示

数据范围

$1\leq $ 第一行单词长度 ≤10\leq1010

$1\leq $ 文章长度 ≤106\leq10^6106

noip2011 普及组第 2 题

key=str(input())
data=str(input())
key=key.upper()
data=data.upper()
mapp=[]
summ=0
num=-1
for item in range(len(data)):
    if data[item]!=' ':
        mapp.append(data[item])
        pass
    else:
        stem=''.join(mapp)
        length=len(mapp)
        mapp.clear()
        if stem==key:
            summ+=1
            if num!=-1:
               continue
               pass
            else:
                num=item-length
if num!=-1:
    print(summ,num)
    pass
else:
    print(num)

这个不能直接用find寻找下标,还是要挨个搜索,思路就是,录入到列表中,每碰到空格就清空列表并判断一次。把所有字符都换成大写或者都换成小写,可以直接进行判断。

用C语言解决洛谷题组中统计单词问题有以下两种方法: #### 方法一 思路是先将输入的单词和文本统一转换为小写,然后遍历文本,跳过空格,通过`strncmp`函比对单词,并判断单词末尾是否为空格以确认是否匹配,同时记录单词出现的次和首次出现的位置。 ```c #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #include<ctype.h> int count;//记录单词 int flag;//标记是不是第一次出现该单词 int pos;//第一次出现的位置 int num;//当前位置 void to_lower(char* p)//大写转小写 { while (*p != &#39;\0&#39;) { if (*p >= &#39;A&#39; && *p <= &#39;Z&#39;) *p += 32; p++; } } int main() { int num = 0; char arr[11] = "\0"; gets(arr); to_lower(arr); int len = strlen(arr); char array[1000000] = "\0"; gets(array);//要注意这里读取字符串用的是两个的gets,因为上一行输入的带有回车,用scanf第二行的gets就读不到东西,因为回车还在缓冲区 char* p = array; to_lower(array); while (*p) { if (isspace(*p))//空格跳过 { num++; p++; continue; } if (!strncmp(arr, p, len) && isspace(p[len]))//比对的单词一样而且单词末尾是空格(如果是字母单词就不是同一个单词) { if (!flag)//第一次找到就保存地址 { pos = num; flag = 1; } count++; p += len + 1; continue; } while (islower(*p))//如果比对不正确,那么这一个单词就不是,就要跳过 { p++; num++; } } if (count) { printf("%d %d", count, pos); } else printf("-1"); } ``` #### 方法二 先将输入的单词和文本统一转换为小写,在文本的首尾添加空格方便比较,通过双重循环找出与给定单词长度相同且字母依次相同的单词,记录其出现次和首次出现位置。 ```c #include<stdio.h> #include<string.h> int main() { char ch[11]; char text[1000010]; text[0] = &#39; &#39;; //将text第一个位置和最后一个位置设为空格,方便比较 scanf("%s", ch); getchar(); gets(&text[1]); text[strlen(text)] = &#39; &#39;; int len = strlen(ch), len2 = strlen(text), place, cnt = 0, flag = 0; for (int i = 0; i < len; i++)//统一大小写 { if (ch[i] >= &#39;A&#39; && ch[i] <= &#39;Z&#39;) ch[i] += 32; } for (int i = 0; i < len2; i++) { if (text[i] >= &#39;A&#39; && text[i] <= &#39;Z&#39;) text[i] += 32; } for (int i = 0; i < len2; i++) { int a = 0; if (text[i] == &#39; &#39; && text[i + len + 1] == &#39; &#39;) //找出与给定单词长度一样的单词 { for (int j = 0; j < len; j++) { if (ch[j] == text[j + i + 1]) //依次比较每个字母是否相同 { a++; //记录相同字母的个 } else break; //遇到不相同的字母立即跳出循环继续寻找下一个单词 } } if (a == len) //找到指定的单词 { cnt++; //单词出现的次加1 if (flag == 0) { //判断该单词是不是第一次出现,若是,则place记录其位置 place = i; flag++; } } } if (cnt == 0) printf("-1\n"); //指定单词未出现输出-1 else printf("%d %d\n", cnt, place); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

直接AC好吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值