C++ 统计单词数
说明:本题目源自叮当码校园,如有侵权,请联系作者删除。
题目:
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同,如果给定单词仅是文章中某一单词的一部分则不算匹配。.
【输入】
第1行为一个字符串,其中只含字母,表示给定单词:
第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
【输出】
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始):如果单词在文章中没有出现,则直接输出一个整数-1。
输入:
To
to be or not to be is a question
输出:
2 0
#include <bits/stdc++.h> using namespace std; int main() { // str1存储要查找的单词 string str1; // str2存储输入的句子 string str2; // count代表单词出现的次数 int count = 0; // index代表第一个单词出现的下标 int index = -1; // 数据的获取 getline(cin,str1); getline(cin,str2); // 分别确认单词的长度和句子的长度 int len1 = str1.length(); int len2 = str2.length(); // 循环遍历句子的没给字符,遍历的长度需要减去单词的长度,后面不够一个单词的长度就没必要继续遍历了 for(int i=0; i<len2-len1; i++) { /* 一个新单词的开始: 1、下标刚好是开头0或者当前字符的前一个字符是空白符 2、当前字符转大写后是A~Z中的某一个字母 以上两个条件应同时满足 */ if((i==0 || str2[i-1]==' ') && (toupper(str2[i])>='A' && toupper(str2[i])<='Z')) { // 设定一个标记,假设我们会比对成功找到单词 bool flag = true; // 循环遍历单词的长度,从单词0下标和句子的i位置开始逐一取出转大写的字符进行比较 for(int j=0;j<len1;j++) { /* 此处str2下标使用i++: ++在后,所以会先使用i的值作为str2下标和str1[j]进行比较 比较完成后i才会执行++操作,也就意味着我们str2句子中下标会同时往前进1 本条判断作用: 如果字符不相同,则flag标记为false,也即否定了我们刚才的假设,同时结束继续往下比较的必要 */ if(toupper(str2[i++]) != toupper(str1[j])) { flag = false; break; } } /* 单词比较完成 找到指定单词的条件: 1、flag仍然为true,也即我们的假设成立 2、我们在句子中所找到的这个单词后面应该为一个空格或者是句子的末尾 以上两个条件应同时满足 关于这里的i:经过上方的for循环,句子中的i下标已经向右移动到了完成比较的字符的后一个位置 */ if(flag && (str2[i] ==' ' || i == len2)) { // 找到单词后对统计值+1 count++; // index赋值,此处注意i应该减去单词的长度以使下标回到单词的开头 if(index == -1) index = i-len1; } // 没找到单词,i应该减,因为for结构体完成后会执行括号中的i++导致句子中的i下标再次右移 else i--; } } // 统计到了单词,输出正常的结果 if(count != 0) cout << count << " " << index; // 没统计到单词,按要求输出-1 else cout << "-1"; return 0; }