资讯详情

洛谷C语言题解:P1308 统计单词数

📅 2026/10/5 8:28:20 | 华诺云谱 👁 阅读
洛谷C语言题解:P1308 统计单词数
P1308 [NOIP 2011 普及组] 统计单词数题目描述一般的文本编辑器都有查找单词的功能该功能可以快速定位特定单词在文章中的位置有的还能统计出特定单词在文章中出现的次数。现在请你编程实现这一功能具体要求是给定一个单词请你输出它在给定的文章中出现的次数和第一次出现的位置。注意匹配单词时不区分大小写但要求完全匹配即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同参见样例 1如果给定单词仅是文章中某一单词的一部分则不算匹配参见样例 2。输入格式共222行。第111行为一个字符串其中只含字母表示给定单词第222行为一个字符串其中只可能包含字母和空格表示给定的文章。输出格式一行如果在文章中找到给定单词则输出两个整数两个整数之间用一个空格隔开分别是单词在文章中出现的次数和第一次出现的位置即在文章中第一次出现时单词首字母在文章中的位置位置从000开始如果单词在文章中没有出现则直接输出一个整数−1-1−1。注意空格占一个字母位。输入输出样例 #1输入 #1To to be or not to be is a question输出 #12 0输入输出样例 #2输入 #2to Did the Ottoman Empire lose its power at that time输出 #2-1说明/提示数据范围1≤1\leq1≤第一行单词长度≤10\leq10≤10。1≤1\leq1≤文章长度≤106\leq10^6≤106。noip2011 普及组第 2 题解题思路题目要求输入了一个目标词和一段句子或文章后输出两个整数一个代表目标词出现了多少次不论大小写另一个代表目标词第一次出现时是在哪里。如果目标词并没有出现过则只输出一个“-1”。为了完成题目要求我们需要实现这些功能输入目标词和句子或文章注意消除目标词和句子末尾的换行符注意输入句子时需要连空格一起读取寻找句子的目标词要将目标词和句子统一转换成小写题目要求不论大小写那就统一小写吧注意使用 ASCII 码时不要把标点符号也转换了用空格来区分一个个词语。注意要跳过空格空格不能算在一个单词内。输出结果根据不同情况输出不同结果解C语言解#includestdio.h//目标单词最长10开15以防万一charword[15];//句子、文章最长可能有10的6次方写大一点防止越界charsent[1000005];intmain(){//读入第一行的目标单词scanf(%s,word);//吃掉 scanf 留下的换行符否则会被下面的 fgets 读到getchar();//用 fgets 读入第二行的整篇文章fgets 可以把空格读进去fgets(sent,sizeof(sent),stdin);//手动计算文章长度数到 \0 为止intsentlen0;while(sent[sentlen]!\0){sentlen;}//手动计算目标词长度intwordlen0;while(word[wordlen]!\0){wordlen;}//去掉文章末尾的换行符并让长度减1if(sentlen0sent[sentlen-1]\n){sent[sentlen-1]\0;sentlen--;}//将目标单词统一转成小写只处理大写字母避免动到其他字符for(inti0;iwordlen;i){if(Aword[i]word[i]Z){word[i]32;}}//将文章也统一转成小写方便后面忽略大小写比较for(inti0;isentlen;i){if(Asent[i]sent[i]Z){sent[i]32;}}//count 记录出现次数firstPos 记录第一次出现的位置-1表示还没找到intcount0;intfirstPos-1;//开始遍历文章按下标 i 逐个处理inti0;while(isentlen){//跳过连续空格空格不属于任何单词while(isentlensent[i] ){i;}//如果跳完空格已经到文章末尾说明没有更多单词了跳出循环if(isentlen){break;}//记录当前单词的起始位置也就是题目要的“位置”intstarti;//往后找到单词结束遇到空格或文章末尾while(isentlensent[i]! ){i;}intendi;//计算当前单词的长度intlenCurend-start;//只有长度和目标单词相同才可能匹配if(lenCurwordlen){intmatch1;//逐个字符比较两边都已转小写for(intj0;jwordlen;j){if(sent[startj]!word[j]){match0;break;}}//如果完全匹配统计次数并记录第一次出现的位置if(match){count;if(firstPos-1){firstPosstart;}}}}//如果一次都没匹配到输出-1//顺便直接 return 结束程序if(firstPos-1){printf(-1\n);return0;}//否则输出出现次数和第一次出现的位置printf(%d %d\n,count,firstPos);return0;}另附上 Java 解importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;publicclassMain{publicstaticvoidmain(String[]args){BufferedReaderbufferedReadernewBufferedReader(newInputStreamReader(System.in));Stringword;Stringsentence;try{wordbufferedReader.readLine().toLowerCase();sentencebufferedReader.readLine().toLowerCase();}catch(IOExceptione){thrownewRuntimeException(e);}intcount0;intfirstPos-1;intwordLenword.length();intsentLensentence.length();inti0;while(isentLen){while(isentLensentence.charAt(i) ){i;}if(isentLen)break;intstarti;while(isentLensentence.charAt(i)! ){i;}intendi;if(end-startwordLen){booleanmatchtrue;for(intj0;jwordLen;j){if(word.charAt(j)!sentence.charAt(startj)){matchfalse;break;}}if(match){count;if(firstPos-1){firstPosstart;}}}}if(firstPos-1){System.out.println(-1);return;}System.out.println(count firstPos);}}
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑