资深的金融行业网站开发,腾讯cdn加速wordpress,优化营商环境条例解读,免费直播app软件下载统计单词数
题目描述
一般的文本编辑器都有查找单词的功能#xff0c;该功能可以快速定位特定单词在文章中的位置#xff0c;有的还能统计出特定单词在文章中出现的次数。
现在#xff0c;请你编程实现这一功能#xff0c;具体要求是#xff1a;给定一个单词#xff0…统计单词数
题目描述
一般的文本编辑器都有查找单词的功能该功能可以快速定位特定单词在文章中的位置有的还能统计出特定单词在文章中出现的次数。
现在请你编程实现这一功能具体要求是给定一个单词请你输出它在给定的文章中出现的次数和第一次出现的位置。注意匹配单词时不区分大小写但要求完全匹配即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同参见样例 1如果给定单词仅是文章中某一单词的一部分则不算匹配参见样例 2。
输入格式
共 2行。
第 1 行为一个字符串其中只含字母表示给定单词
第 2 行为一个字符串其中只可能包含字母和空格表示给定的文章。
输出格式
一行如果在文章中找到给定单词则输出两个整数两个整数之间用一个空格隔开分别是单词在文章中出现的次数和第一次出现的位置即在文章中第一次出现时单词首字母在文章中的位置位置从 0 开始如果单词在文章中没有出现则直接输出一个整数 −1。
注意空格占一个字母位
输入输出样例
输入 #1
To
to be or not to be is a question输出 #1
2 0输入 #2
to
Did the Ottoman Empire lose its power at that time输出 #2
-1说明/提示
数据范围
1≤ 第一行单词长度 ≤10。
1≤ 文章长度 ≤10^6。
解
这道题我先说一下错误思路算是提供一下反例吧
最开始我的思路是利用C的流式字符串的特性把各个单词分开然后存储到一个字符串数组中然后匹配字符串数组中数组元素小写匹配看是否与目标单词一致若一致则计数器加一记录首次符合条件的数组元素下标然后根据下标计算前面有多少个字符也就是在原字符串的首次出现下标。
这里面其实有个关键问题就是我们并不能确定每个单词之间相隔多少个空格
这就导致了我们在流式操作后无法计算得到正确的首次出现的下标位置 没办法这种操作是行不通的那么只能传统的使用滑动窗口的方式了
设置滑动窗口大小为目标单词长度再均变为小写字母后遍历字符串的对应窗口看窗口内字符是否与目标单词匹配。这里面要注意循环时的结束条件应为字符串长度-滑动窗口长度1
当然还有之后还有一步判断就是保证成功匹配的是一个独立的单词而不是某单词的前缀
这要求若滑动窗口不在首尾前后一定是空格
若上述条件均满足计数器加一记录首次出现的位置即可
#includebits/stdc.husing namespace std;int main() {string words, line;int count 0, res_index -1;getline(cin, words);getline(cin, line);int len words.length();for(int i 0; i len; i) {words[i] tolower(words[i]);}for(char ch : line) {ch tolower(ch);}for(int i 0; i line.length() - len 1; i) {int flag 1;for(int j 0; j len; j) {if(line[ij] ! words[j]) {flag 0; break;}}if(i ! 0 line[i-1] ! ) flag 0;if(i ! line.length() - len line[ilen] ! ) flag 0;if(flag 1) {count;if(res_index -1) res_index i;}}if(res_index -1) cout -1 endl;else {cout count res_index endl;}return 0;
}