首页 > 其他分享 >洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考

洛谷P1308统计单词数,strtok函数的使用以及对于单词分割的一些思考

时间:2023-04-08 12:45:32浏览次数:48  
标签:char 洛谷 strtok Pattern 单词 字符 include

[NOIP2011 普及组] 统计单词数

题目描述

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

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

输入格式

共 \(2\) 行。

第 \(1\) 行为一个字符串,其中只含字母,表示给定单词;

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

输出格式

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

样例 #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 $ 第一行单词长度 \(\leq10\)。

$1\leq $ 文章长度 \(\leq10^6\)。

noip2011 普及组第 2 题

————————————————————————————————————————————————————以上为题目
这道题的恶心点在于如何比较以及如何记录当前单词的位置,可以知道题目要求不论大小写的比较,因此我们必须将模式串和比较串统一大写或者统一小写然后调用strcmp函数来比较两者是否完全一至。
然后就是如何分割出单词,这里使用string库里的strtok函数
其定义如下
char *strtok(char *str, const char *delim);
其中Str为要被分割的字符串,delim为作为分割符的字符串
strtok函数会根据delim里的每一个单字符作为分隔符,将Str分割
strtok在切割字符串的时间,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。
例如

点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
int main()
{
	char S[50] = { "  ABC DEF GH   QEL" };
	char Del[2] = " ";
	char* K = strtok(S, Del);
	while (K != NULL)
	{
		printf("%s %d", K, K - S);
		K = strtok(NULL, Del);//第二次调用要传入NULL,用来定位下一次的切割
	}
	return 0;
}
strtok函数的作用原理是strtok会从传入的字符指针开始向后扫瞄直到找到第一个非Del字符里的字符并标记为初始位置不妨叫他为Str,他是一个字符指针,此位置即为最后返回值。然后继续向后扫瞄直到找到Del字符里的字符为止,strtok会将这个字符直接在原字符串里替换为\0,然后返回Str这个字符指针,因此调用strtok会将原字符串改变。当找到末尾时,strtok回返回NULL,若在模式串中找不到分隔符,则直接原地返回字符串的首地址。

注意第二次分割参数传入NULL
因此借用strtok,我们可以以空格为分隔符来将单词分割出来并且得知其首字母在原字符串中的指针位置K,我们只需要让K减去模式串的首地址即可得知这个单词在模式串中的位置

有如下代码

点击查看代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
bool MyStrcmp(char* S, char* Pattern)
{
	int i;
	for (i = 0; S[i] && Pattern[i]; i++)
	{
		if (S[i] == Pattern[i] || S[i] - 32 == Pattern[i] || S[i] + 32 == Pattern[i])
			continue;
		else
			break;
	}
	if (!S[i] && !Pattern[i])
		return 1;
	else
		return 0;
}
int main()
{
	char S[10];
	scanf("%s", S);
	char Pattern[1000000];
	getchar();
	gets(Pattern);
	int cnt = 0;
	int Position = -1;
	char Del[2] = " ";
	char* K = strtok(Pattern, Del);
	while (K != NULL)
	{
		if (MyStrcmp(S, K))
		{
			cnt++;
			if (Position == -1)
				Position = K - Pattern;
		}
		K=strtok(NULL, Del);
	}
	if (Position != -1)
		printf("%d %d", cnt, Position);
	else
		printf("-1");
	return 0;
}
这里使用的逐个字母枚举比较,当然也可以将字符串全部转换为大写或者小写然后strcmp 大小写转换可以使用函数toupper(char c)//将字符c转换为大写,tolower(char c)//将字符c转为小写,不过这是单字符的转换,可以使用循环将字符串里的字母统一大小写

标签:char,洛谷,strtok,Pattern,单词,字符,include
From: https://www.cnblogs.com/WKWKSL/p/17298323.html

相关文章

  • 12、单词
    2023/4/7SectionsAbudget,价格低廉的、花钱少的、预算、把······编入预算airline,航空公司budgetairline,廉价航空公司integrate,(使)融入、结合在一起cabin,机舱、船舱、小屋、小棚屋coincidence,巧合、巧事、并存psychology,心理学、心理associated,有联系的、有关......
  • 洛谷P1552 [APIO2012] 派遣 题解 左偏树
    题目链接:https://www.luogu.com.cn/problem/P1552题目大意:每次求子树中薪水和不超过\(M\)的最大节点数。解题思路:使用左偏树维护一个大根堆。首先定义一个Node的结构体:structNode{ints[2],c,sz,dis;longlongsum;Node(){};Node(int_c){s......
  • 蓝桥-单词分析
    https://www.lanqiao.cn/problems/504/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3#include<bits/stdc++.h>//包含所有常用的头文件usingnamespacestd;intmain(){map<char,int>m;//定义一个map,用于存储字符和出现次数的......
  • 洛谷4113(树状数组+离线处理)
    [HEOI2012]采花题目描述萧薰儿是古国的公主,平时的一大爱好是采花。今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花。花园足够大,容纳了$n$朵花,共有$c$种颜色,用整数$1\simc$表示。且花是排成一排的,以便于公主采花。公主每次采花后会统计采到的花的颜色数,颜色......
  • 洛谷 P3377 【模板】左偏树(可并堆)题解 左偏树模板题
    题目链接:https://www.luogu.com.cn/problem/P3377维护左偏树的同时还需要维护一个并查集。但是并查集也就一个find操作。pop的时候更新f[x]的操作很神奇。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;intn,m,op,x,y,val[m......
  • 对未来的自己的一个提醒。关于打表答题的思路,洛谷P5731
    P5731【深基5.习6】蛇形方阵-洛谷|计算机科学教育新生态(luogu.com.cn)这道题就是纯纯找规律的模拟题,但是在比赛或者思维比较松散的情况下紧张的时候会想不出模拟思路这时候如果测试数据的范围比较小,如本题的数据最大就到九阶方阵,所以可以手算出每一种类型打表输出,不用去......
  • 洛谷 P2398. GCD SUM
    题目描述求$$\sum\limits_{i=1}^n\sum\limits_{j=1}^n\gcd(i,j)$$输入:2输出:5算法1 线性筛 $O(n)$将式子变形:要知道一个前置定理$\sum\limits_{d|n}\varphi(d)=n$艾弗森约定:定义$\\\[P]$=$$\begin{cases}P\text{}is\text{}tr......
  • [每天例题]蓝桥杯 C语言 单词分析
    蓝桥杯C语言单词分析题目  题目要求1.寻找出现最多的字母和这个字母出现的次数。2.如果有多个字母出现的次数相等,输出字典序最小的那个。思路分析输入方法:方法一:1.可以通过数组来记录该单词,并为单词出现的每一个字母做上标记。2.可以采用for循环将字符串依次输......
  • 洛谷 P8918 『MdOI R5』Jump 题解
    题目传送门这一题其实很简单,只是要想到正确方法我一开始用了奇怪的搜索①无解的情况:看上去很离奇,实际上略加思索就会发现,如果输入\(n\)为偶数,那么就铁定无解。证明过程如下:令\(n\bmod{2}=0\),人距离\(n\)点的距离为\(dis\),则当走出第一步(步长为\(1\))时,有:\[dis=\midn......
  • 洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重
    经典01背包题首先介绍一下01背包,即一种DP问题,以放置物品为模型,每个物品只能放一次。其区分于完全背包(每个物品可以放无限多次),以及多重背包(每个物品有一个固定次数上限)。题中给出了$N$个砝码及每个砝码的质量,要求我们求出可以称出质量的种数。由此想到转化为01背包。......